0
identifier [\._a-zA-Z0-9\/]+
comment "//"

<*>{comment}  {
    cout<<"Comment\n";
  char c;
  while((c= yyinput()) != '\n')
    {
    }
}

<INITIAL>{s}{e}{t} {
   BEGIN(SAMPLE_STATE);
   return SET;
}

<SAMPLE_STATE>{identifier} {
    strncpy(yylval.str, yytext,1023);
    yylval.str[1023] = '\0';
  return IDENTIFIER;
}

上記の lex コードでは、「// set name」が解析されるときにエラーは発生しません。解析された文の「//」の後のスペースに注意してください。ただし、「//セット名」が解析されると、エラーが報告されます。識別子とコメントの両方に表示されるスラッシュと関係があると思います。私が間違っているところを指摘できますか?ありがとう。

エラーは yyerror によってキャッチされます

4

1 に答える 1

0

Lex は常に、どのコンテキストでも最長の一致に一致します。したがって、入力が の場合//set、それはパターンに一致し{identifier}ます。上記のコード以外SAMPLE_STATEに lex の状態を設定していないため、 state にいるときにこの問題に遭遇する可能性が高いため、レクサーはルールを照合して残りの部分をスキップSAMPLE_STATEするのではなく、識別子として返すだけです。{comment}ライン。

この問題を回避する方法はいくつかあります。{comment}パターンの残りの行にルールを一致させることができます。

<*>"//".*   {
    cout << "Comment\n"; }

これにより、残りの行を明示的に読み取る必要がないことに注意してください。

/または、識別子で複数の連続する文字を禁止することもできます。

identifier (/?[._a-zA-Z0-9])*/?
于 2013-08-19T22:30:45.653 に答える