次: Flex and POSIX (Flex 2.5), 前: Flex, 上: Flex
Flexは、 大体のところLexおよびPOSIXの両方と互換性があります。 将来は (Flex、POSIXのどちらかが変わることによって)、 さらにPOSIXとの互換性を高めていくでしょう。 しかし、 Flex、Lex、POSIXには、 異なる部分もいくつかあります。 それを以下に示します。
このことがもたらす主要な問題の1つに、 マッチの優先順位に影響を与え、 FlexとLexの間でスキャン処理に微妙な差異が出てくるということがあります。 この問題の例については、 パターン・セクションを参照してください。
input()
input()
は再定義可能ではありません。
Flexで入力を制御するためには、
input()
を再定義する代わりに、
YY_INPUT
という拡張機能を使います
(これは現在のところPOSIXではサポートされていません)。
また、
Lexとは異なり、
Flexのinput()
はyytext
の値を変更するという点に注意してください。
output()
output()
ルーチンをサポートしていません。
ECHO
の出力はyyout
経由で行われます。
このyyout
のデフォルトはstdout
です。
これを使うようにoutput()
を書くことも可能ですが、
現在のPOSIXのドラフト仕様は、
output()
が正確には何をすべきなのかを示していません。
%r
)をサポートしていません。
yylineno
yywrap()
yywrap()
はマクロです。
POSIXのドラフト仕様では、
これは関数であるべきとされていますので、
おそらく将来は変更されることになるでしょう。4
unput()
unput()
はyytext
とyyleng
の値を破壊しますが、
次のトークンがマッチされるまでは、
これは不当です。
LexとPOSIXでは、
yytext
とyyleng
はunput()
の影響を受けません。5
ab
の後ろに1個、2個、または3個のc
が続くもの」
にマッチすべきとなっています。
Flexはこのとおりに動きますが、
Lexはこれを
「1個、2個、または3個のabc
」
と解釈します。
yytext
yytext
の正しい定義は`extern char *yytext'ですが、
Lexでは`extern char yytext[]'です。6
配列によるアクセス方法は、
性能にかなりの影響を及ぼすので、
Flexでは`extern char *yytext'を使い続けるでしょう。
最新のPOSIXドラフト仕様は、
`%array'と`%pointer'を導入することによって、
両方の方法をサポートしています。
これは、
FlexとLexのいずれにもまだ組み込まれていません。7
%p
、%a
等)がありますが、
Flexでは必要ありません。
互換性のために認識はされますが、
無視されるだけです。
FLEX_SCANNER
FLEX_SCANNER
が#define
によって定義されています。
{...}
を使うことなく、
単一行において複数の文を置くことができます。
これに対してLexは、
そのような行を単一文に切り詰めてしまいます。
yyterminate()
、yyrestart()
、<<EOF>>
、YY_DECL
、#line
指示子#line
指示子の説明に関しては、
See Flex コマンドライン・オプションの要約。
[1] 訳注:Flex 2.5では、 `-l'オプションを指定して生成されたスキャナは、 Lexの場合と同じように、 定義を展開する時に丸括弧( )で囲みません。
[2] 訳注:Rational Fortran
[3] 訳注:Flex 2.5では、
Flex起動時に`-l'オプションを指定するか、
スキャナ定義ファイルの中に`%option yylineno'を指定することによって、
変数yylineno
を利用することができます。
[4] 訳注:Flex 2.5では、
`%option noyywrap'が指定されない限り、
yywrap()
は関数です。
[5] 訳注:Flex 2.5では、
`%array'を指定すれば、
unput()
はyytext
の内容を破壊しません。
[6] 訳注:Flex 2.5では、
`%pointer'と`%array'により、
yytext
の型を選択できるようになりました。
デフォルトは`%pointer'です。
[7] 訳注:Flex 2.5は、 `%pointer'と`%array'をサポートしています。