Bison Lex-识别模糊标记
全部, 在我的Lex文件中,我们将一些操作符识别为令牌,其中一些操作符是Bison Lex-识别模糊标记,bison,yacc,lex,flex-lexer,Bison,Yacc,Lex,Flex Lexer,全部, 在我的Lex文件中,我们将一些操作符识别为令牌,其中一些操作符是 ":p" and ":" 问题是,任何以:p开头的单词,比如“:presentation”,都不会被识别为 ':' word /*grammar*/ 由于返回的lex值“:p”作为下一个标记,将触发解析错误 如何解决这种歧义?您应该定义一个lexer规则来匹配整个“symbol”标记,例如 :[a-zA-Z_][a-zA-Z0-9_]* { yylval.symbol = strd
":p"
and
":"
问题是,任何以:p开头的单词,比如“:presentation”
,都不会被识别为
':' word /*grammar*/
由于返回的lex值“:p”
作为下一个标记,将触发解析错误
如何解决这种歧义?您应该定义一个lexer规则来匹配整个“symbol”标记,例如
:[a-zA-Z_][a-zA-Z0-9_]* { yylval.symbol = strdup(yytext + 1); return SYMBOL; }
如果需要,您可以在此规则中检查:p
和特殊情况,例如:
:[a-zA-Z_][a-zA-Z0-9_]* {
if (strcmp(yytext, ":p") == 0) {
return OP_P;
}
yylval.symbol = strdup(yytext + 1);
return SYMBOL;
}
是的,事实上我已经这样做了,当我在我的问题中写到toke单词(你的例子中的符号)时,我返回。问题是,我在LEX中有两个规则,并且“:p”可以由这两个规则验证。我的建议是,删除较短的规则,并在较长的规则中添加一个复选框。我马上修改我的答案。很好的方法,我应该测试一下