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”时没有错误。请注意解析的句子中“//”后面的空格。但是,在解析“//set name”时,却报错。我相信这与标识符和注释中出现的正斜杠有关。你能指出我哪里出错了吗?谢谢。

错误被 yyerror 捕获

4

1 回答 1

0

Lex 总是匹配任何上下文中最长的匹配项。因此,当输入为//set时,它将匹配一个{identifier}模式。由于除了上述代码之外,您从未将 lex 状态设置为任何其他内容SAMPLE_STATE,因此当您处于 state 时,您可能会遇到此问题SAMPLE_STATE,因此词法分析器只是将其作为标识符返回,而不是匹配{comment}规则并跳过其余部分线。

有很多方法可以避免这个问题。您可以让{comment}规则与模式中的其余行匹配:

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

请注意,有了这个,您不需要显式阅读该行的其余部分。

/或者,您可以在标识符中禁止多个连续字符:

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