在 flex 中编写令牌生成器时,我遇到了这个烦人的错误:“无法识别的规则”
我的代码是:
/* Keywords */
TYPE int|double|bool|char
LOGICAL if|else|for|foreach|do|while|switch|return
MACROWORD import|define|ifndef|endif|elseif|udef
MACRO "#"{MACROWORD}
KEYWORD {TYPE}|{LOGICAL}|{MACRO}
/* Literals */
DIGIT [0-9]
DIGITS {DIGIT}+
OPT_FRAC ("."{DIGITS})?
OPT_EXP (E(+|-){DIGITS})?
NUMBER {DIGITS}{OPT_FRAC}{OPT_EXP}
LETTER [a-zA-Z]
/* Identifier */
ID {LETTER}({LETTER}|{DIGIT})*
/* Operators */
OPERATOR "+"|"-"|"*"|"/"|"^"|"=""="|"<""="|">""="|">"|"<"|"!""=""
%%
{KEYWORD} printf("(Keyword, %s)\n", yytext);
{NUMBER} printf("(Numeric Literal, %s)", yytext);
{ID} printf("(Identifier, %s)", yytext);
{OPERATOR} printf("(Operator, %s", yytext);
[ \n\t] /* Ignore Whitespace */
"{" printf("(L Bracket, %s)", yytext);
"}" printf("(R Bracket, %s)", yytext);
"(" printf("(L Parens, %s)", yytext);
")" printf("(R Parens, %s", yytext);
";" printf("(Semicolon, %s", yytext);
%%
main()
{
yylex();
}
可悲的是,这只会导致:
"Scanner.lex:39: unrecognized rule" 重复19 次后面跟着一个实例:
“Scanner.lex:43:无法识别的规则”
第 39 行是:
{NUMBER} printf("(Numeric Literal, %s)", yytext);
第 43 行是:
{OPERATOR} printf("(Operator, %s", yytext);
我在互联网上搜索并在 stackoverflow 上找到了这个答案,其中建议在定义行的开头添加“^”,所以我将第 39 行引用(NUMBER)更改为:
NUMBER ^{DIGITS}{OPT_FRAC}{OPT_EXP}
什么都没做。有什么建议么?