Bison 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

全部,

在我的Lex文件中,我们将一些操作符识别为令牌,其中一些操作符是

":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”可以由这两个规则验证。我的建议是,删除较短的规则,并在较长的规则中添加一个复选框。我马上修改我的答案。很好的方法,我应该测试一下