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
捕获答案 0 :(得分:0)
Lex始终匹配任何上下文中的最长匹配。因此,当输入为//set
时,将匹配{identifier}
模式。由于您从未在上面的代码中将lex状态设置为SAMPLE_STATE
以外的任何其他状态,因此当您处于状态SAMPLE_STATE
时,可能会遇到此问题,因此词法分析器只会将其作为标识符返回而不是匹配{comment}
规则并跳过其余部分。
有许多方法可以避免这个问题。您可以让{comment}
规则与模式中的其余部分匹配:
<*>"//".* {
cout << "Comment\n"; }
请注意,使用此功能,您无需显式读取该行的其余部分。
或者,您可以在标识符中禁止多个连续的/
个字符:
identifier (/?[._a-zA-Z0-9])*/?