質問

私は、パーサジェネレータのためのFlexとバイソンを使用して、私のスキャナでスタート状態に問題を抱えている。

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

%x COMMENT

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

"=="                  { return EQUALEQUAL; }

.                     ;

この簡単な例では、行:

// a == b

私はこのルールを含めない限り、コメントとして完全に一致しません

<COMMENT>"=="             ;

どのように私は私の排他的ルールにすべてのこれらのトークンを追加することなく、このラウンドを取得するのですか?

役に立ちましたか?

解決

レックス/ FlexでCスタイルのコメントをマッチングまたは何も文書化されます:

ドキュメントの中、ならびにインターネットの周りの様々なバリエーション

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

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

他のヒント

[^ n]は、ルールの後に "+" を追加してみてください。排他状態がまだでも排他状態で「==」拾っている理由を私は知らないが、どうやらそれはあります。 Flexは、通常、ほとんどのテキストと一致したルールに一致し、「+」を追加すると、少なくとも二つの規則は、長さに結びつけるようになります。 COMMENTルールを置くことはまず、それが同数の場合に使用されるようになります。

手がかりはあります:

  

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

これはゼロまたはそれ以上の非改行にマッチする*を追加します。あなたはゼロにしたいそうでない場合は、空のコメントが一致しません。

%x COMMENT

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

"=="                  { return EQUALEQUAL; }

.                     ;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top