2016-04-02 5 views
0

Lexには、一連のルールが定義されています。ルールは、スペースなどで区切られたトークンにのみ適用されますか?ルールに一致するブロックがラインバッファにある場合、それは機能しますか?Lex - ルールはトークンまたはトークンのシーケンスにのみ一致しますか?

たとえば、プログラムの機能(void sum()など)を "void" [a-zA-Z] + "()"などのルールでチェックするルールを作成する場合は、このルールは1行に一致する必要があります。 1つ以上のトークンにまたがるルールはLexで動作できますか?

答えて

0

yylexを呼び出すと、現在のバッファポインタから始まる最長一致がになります。それはトークンを検索しません。ルールがスペース文字と一致することができるならば、それはスペースにマッチします。

Lexは「token」が「ルールと一致する文字のシーケンス」以外であることを知らないので、ルールがトークン以上に及ぶ可能性があるかどうかは意味がありません。定義によれば、ルールと一致するものはすべてトークンです。

スキャナは現在のバッファポインタで開始しないものと決して一致しないので、常に一致するルールがいくつか存在する必要があります。デフォルトでは、lexは末尾に任意の文字に一致するルールを追加し(必要に応じて)、yyoutにエコーします。あなたは、トランスデューサを書いている場合を除き、それはあなたが望むものをほぼ確実ではないので、私はいつも(あなたが実際にこれまでで最も一般的なのlexの実装である、flexを使用していると仮定して)あなたは

%option nodefault 

を追加することをお勧めします。これはデフォルトルールを抑制し、入力と一致するルールがない可能性がある場合は警告を表示します。次に、独自のフォールバックルールを定義できます。

.|\n { return yytext[0]; } 

またはスキャナエラーが発生する可能性があります。

関連する問題