レックス/ Flexでの状態を開始
-
16-09-2019 - |
質問
私は、パーサジェネレータのための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; }
. ;
所属していません StackOverflow