Next: Strings, Previous: Pattern Matching, Up: Pattern Matching
いくつかの文字はFlexにとって特別の意味があり、 その文字を単独で使ったのでは、 その文字自体を表すことができません。 以下に、 Flexにおける特殊文字とその意味を表にして示します。
- 文字
- Flexによる解釈
.
- ピリオドは改行(‘\n’)以外の任意の文字を表します。
\
- バックスラッシュはエスケープ文字です。 エスケープ・シーケンスはANSI Cのものと同一です。
[ ]
- 角括弧[ ]は複数の文字を文字クラスにグループ化します。 詳細については、 See Flexにおける文字のグループ化。
^
- 文字クラスの内部では^は否定を意味します。 詳細については、 See Flexにおける文字のグループ化。 文字クラスの外部では、 ^は行の先頭を意味し、 ルールの先頭にのみ置くことができます。 例を以下に示します。
[^AB]
- 否定クラスです。
^foo
- 行の先頭にある‘foo’という文字の並びにのみマッチします。
foo^
- この場合、 ‘^’は普通の文字であるとみなされます。 このような時には、 希望どおりの結果が確実に得られるようにするために、 特別な意味を持つ文字の前にバックスラッシュ‘\’を置くのが良いでしょう。 このような文字の並びをエスケープ・シーケンスと呼びます。 エスケープ・シーケンスについてはこの節の最後で説明します。
-
- ハイフンは文字クラスの内部において文字の範囲を表します。 文字クラスの外部では、 ハイフンはそれ自身を表します。 詳細については、 See Flexにおける文字のグループ化。
{ }
- 大括弧{ }は、 定義の参照、複数行のアクションの囲み、またはある範囲にわたる繰り返しの定義を行います。 例を挙げると、 定義
FOO
があって、 それをルールの中で参照したい場合に{FOO}
を使います。与えられたパターンのある範囲にわたる繰り返しを定義するには、 以下のような‘{ repetition list }’を使います。
%% f{2,5} /* fの2回以上5回以下の繰り返し */ /* にマッチ */ f{2,} /* fの2回以上の繰り返しにマッチ */ f{2} /* fの2回の繰り返しにマッチ */この用法の解釈において、 FlexとLexの間にはいくつかの相違点があります。 詳細については、 Flex and POSIXを参照してください。
( )
- 丸括弧( )を使って優先順位を変更することができます。 また、 定義が展開される時には、 その定義は暗黙のうちに丸括弧( )で囲まれることに注意してください。1 このため、 Lexとは非互換なところがでてきます。 この点については、 Flex and POSIXとDefinitionsで説明しています。
""
- 二重引用符記号は文字列を表します。 引用符の内側の文字列だけがマッチの対象になります。 したがって、
%% "string"は
"string"
にではなく、string
にマッチします。/
- スラッシュは後続コンテキスト(trailing context)を設定します。 これは、 あるパターンの後ろに特定の文字の並びが続く場合のみ、 そのパターンを認識したいという状況です。 つまり、 スラッシュ‘/’は「ルック・アヘッド(その先を見る)」演算子として機能するということです。 例を挙げると、
abcDEF
- ‘abcDEF’ を認識します。
abc/DEF
- ‘abc’の後ろに‘DEF’が続く場合に限り、 ‘abc’を認識します。 ‘DEF’の部分は、 あたかもまだ読まれてはいないかのように扱われ、 マッチの対象になりません。
注:1つのルールの中では‘/’は1つだけ許されます。 つまり、
abc/def/hijklは不正です。
< >
- かぎ括弧< >はスタート状態を参照します。 また、 EOFシンボル(‘<<EOF>>’)にも使われます。 完全な説明については、 Start StatesとEnd-Of-File Rulesを参照してください。
? + *
- ‘?’、‘+’、‘*’は、 ある正規表現が現れることのできる回数を設定します。 ‘?’は0回もしくは1回 (その正規表現が現れることは必須ではないということ) を意味します。 ‘+’は1回以上を意味します。 ‘*’は0回以上を意味します。 例えば、
a?
- 0個もしくは1個の
a
にマッチします。a+
- 1個以上の
a
にマッチします。a*
- 0個以上の
a
にマッチします。(ABC)+
- ‘ABC’という文字の並びが1回以上続くものにマッチします。
[abQrS]?
- 0個もしくは1個の、 (5つの文字‘abQrS’から構成される) この文字クラスのメンバにマッチします。 文字クラスに関する詳細については、 Flexにおける文字のグループ化を参照してください。
{NUM}*
- 0個以上の
NUM
にマッチします。 ここでのNUM
は定義です。 定義に関する詳細については、 Definitionsを参照してください。|
- OR演算子、 および、 特別なアクションを表します。 例えば、
apples|orangesは
apples
もしくはoranges
のいずれかにマッチし、apples | oranges printf("fruit!\n");は、
apples
とoranges
の両方に対して同一のアクションを実行します。$
- ドル記号は行末を意味します。 例えば、
end$はその直後が行末である場合にのみ‘end’という文字の並びにマッチします。 これは、 後ろに続くのが行末のマーカである場合のみ‘end’にマッチする
end/\nとまったく同じです。
こうした文字のいずれかをその文字自身として表したい場合には、 引用符で囲むか、 (後に示す表で説明する) エスケープ・シーケンスとして表さなければなりません。
Flexには3種類のエスケープ・シーケンスがあります。 バックスラッシュ‘\’に続けて8進数を使うもの、 ‘\x’に続けて16進数を使うもの、 ‘\letter’という表記法によってある1文字、 または、 特別な表示不可の文字を表すものの3つです。 Cをよく知っている人であれば、 この3つがANSI Cのエスケープ・シーケンスであることに気がつくことでしょう。 数値によるエスケープ・シーケンスは、 100パーセント移植性があるわけではなく、 保守を困難にするので、 避けるべきです。
以下に、
文字の使用に関する要約を示します。
この表中では、
‘c’が単一の文字を、
‘NNN’が8進定数を、
‘HH’が16進定数を表します。
注:いくつかのバージョンのLexでは、
‘\0’を正しく認識、
またはマッチしません。
これは、
‘\0’がNUL、
つまりC文字列の終端文字だからです。
Flexでは、
NULをマッチの対象にしても問題はありませんが、
性能には若干影響します。
さらに付け加えると、
‘^’演算子と‘<<EOF>>’はルールの先頭にのみ置くことができます。
また、
これらと‘$’、‘/’は丸括弧( )の内部に置くことはできません。
このことはまた、
定義の正当性にも影響を及ぼします。
というのは、
展開される時に定義は字義どおりに丸括弧( )で囲まれるからです。2
詳細については、
DefinitionsとFlex and POSIXを参照してください。