私は次の文を含む40年前のlexプログラムを使用しています。
BEGIN PROGRAM + 1;
私は何を理解していますか?
BEGIN PROGRAM
それは本当ですが、これの目的は何ですか+ 1
?コンテキストの最初のルールをスキップしますか<PROGRAM>
?生成されたコードではそうでないと提案されていますが、まだ調査していません。 contextの後にリストされたコンテキストを選択しますか<PROGRAM>
?これはより合理的に見えますが、テストlexプログラムはこれらの意図をサポートしていません(おそらくテストプログラムが正しく書かれていない可能性があります)。私は40年前のlexバージョンではなくflexを使用しています。
完全性のために、テストプログラムは次のとおりです。
$ cat t.lex
%s A B C
%%
BEGIN A;
<A>[BC] if (yytext[0] == 'B') BEGIN B + 1; else BEGIN C;
<A>. printf("A: '%c'\n", yytext[0]);
<B>[AC] if (yytext[0] == 'A') BEGIN A; else BEGIN C;
<B>. printf("B: '%c'\n", yytext[0]);
<C>[AB] if (yytext[0] == 'A') BEGIN A; else BEGIN B;
<C>. printf("C: '%c'\n", yytext[0]);
%%
main() { yylex(); }
$ echo abcBabc | ./a.out
A: 'a'
A: 'b'
A: 'c'
B: 'a'
B: 'b'
B: 'c'
$
答え1
lexプログラムには次のものがあります。開始条件、それらは次のように定義されます。%s
次のディレクティブ:
%s PROGRAM COMMENT WHATEVER
その後、使用BEGIN
マクロ。クイックチェックのために、flexには1から始まる連続した数字があります。INITIAL
状態は0
)。
lex.yy.c
flexを実行すると、次の行が表示されます。
#define INITIAL 0
#define PROGRAM 1
#define COMMENT 2
#define WHATEVER 3
たとえば、表面的なプログラマはハードコーディングすることにしました。1
記号を使用する代わりに。