2009-07-15 13 views
5

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

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

%x COMMENT 

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

"=="     { return EQUALEQUAL; } 

.      ; 

この単純な例では行:

// a == b 

ISN」をこのルールを含めない限り、このルールを完全にコメントとしてマッチさせてください:

<COMMENT>"=="    ; 

どうすればいいですか?これらのトークンをすべて私の排他的なルールに追加する必要はありませんか?レックス/フレックスまたは任意に

答えて

9

マッチングCスタイルのコメントが十分に立証されている:インターネット周り

in the documentation、ならびに様々なバリエーションを。ここで

は、Flexのドキュメントで見られるのバリエーションです:

<INITIAL>{ 
    "//"    BEGIN(IN_COMMENT); 
    } 
    <IN_COMMENT>{ 
    \n  BEGIN(INITIAL); 
    [^\n]+ // eat comment 
    "/"  // eat the lone/
    } 
+0

多くのルールがあるので避けることができれば、包括的な状態を使用する必要はありません。問題は、この 'eat comment'ルールが、複数の文字(==など)を持つトークンと一致しないように見えるということです。 – Dan

+0

それから間違ったことをしているかもしれないと思います。あなたの通常のトークンと一致しないコメントのための 'サブパーサー'を作成する必要があります。 –

+0

言っておきますが、各入力の行を保存したい場合は、行番号が間違っていますか? –

2

は[^ n]は、ルールの後に "+" を追加してみてください。排他的な状態が依然として排他的な状態でも「==」を取り上げている理由は分かりませんが、明らかにそうです。 Flexは通常、ほとんどのテキストにマッチするルールにマッチし、 "+"を追加すると少なくとも2つのルールが同じ長さになります。 COMMENTルールを最初に置くと、同調の場合に使用されます。

0

手掛かりがある:

問題はこの「コメント食べる」 ルールはとてもゼロに一致するように*を追加する複数の文字

とトークンと一致していないようですそれ以外の改行ではありません。そうでなければ空のコメントは一致しません。

%x COMMENT 

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

"=="     { return EQUALEQUAL; } 

.      ; 
+0

空のコメントは、そのルールの一致を引き起こすことも、必要でもありません。 – Darryl

+0

真、それ以下の行がそれを捕まえる。 *を+に変更しても安全です。 –

関連する問題