6

パーサー ジェネレーターに Flex と Bison を使用していますが、スキャナーの開始状態に問題があります。

コメントを処理するために排他的なルールを使用していますが、この文法は引用されたトークンと一致しないようです:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

この簡単な例では、次の行:

// a == b

次のルールを含めない限り、コメントとして完全に一致するわけではありません。

<COMMENT>"=="             ;

これらすべてのトークンを排他的ルールに追加することなく、これを回避するにはどうすればよいですか?

4

3 に答える 3

2

[^n] ルールの後に「+」を追加してみてください。排他状態でも排他状態が「==」を拾っている理由はわかりませんが、どうやらそうです。Flex は通常、最も多くのテキストに一致するルールに一致し、「+」を追加すると、少なくとも 2 つのルールの長さが一致します。COMMENT ルールを最初に配置すると、引き分けの場合に使用されます。

于 2009-07-19T06:46:27.087 に答える
0

手がかりは次のとおりです。

問題は、この「コメントを食べる」ルールが、複数の文字を持つトークンに一致しないように見えることです

* を追加して、0 個以上の非改行に一致させます。そうしないと、空のコメントは一致しません。

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
于 2009-07-20T01:25:39.930 に答える