私はコンパイラ構築のコースを受講しており、現在の課題は、実装している言語のレクサーを作成することです。レクサーが連結されたトークンを認識しなければならないという要件を満たす方法がわかりません。つまり、空白で区切られていないトークンです。例: 文字列は数字とキーワード39if
として認識されるはずです。同時に、レクサーは無効な入力に遭遇したときにも実行する必要があります。39
if
exit(1)
私が持っているコードの簡略版:
%{
#include <stdio.h>
%}
%option main warn debug
%%
if |
then |
else printf("keyword: %s\n", yytext);
[[:digit:]]+ printf("number: %s\n", yytext);
[[:alpha:]][[:alnum:]]* printf("identifier: %s\n", yytext);
[[:space:]]+ // skip whitespace
[[:^space:]]+ { printf("ERROR: %s\n", yytext); exit(1); }
%%
これ (または私の完全なバージョン) を実行して input を渡すと39if
、エラー ルールが一致し、出力はERROR: 39if
次のようになります。
number: 39
keyword: if
(つまり、入力として入力した場合と同じ39 if
です。)
マニュアルによると、エラー ルールが数字やキーワード ルールよりも長い可能な入力に一致し、flex がそれを優先することが原因であるという予感があります。とは言っても、この状況を解決する方法がわかりません。エラー以外のすべての入力を拒否する明示的な正規表現を作成することは実行不可能に思えます。また、字句解析エラーを処理するために「キャッチオール」ルールを作成する方法が他にわかりません。
更新:キャッチオールルールを作成することもできると思います. { exit(1); }
が、「1行目で混乱しました」よりも優れたデバッグ出力を取得したいと思います。