Flex 词法分析器中无法识别的规则
Unrecognized rule in Flex lexer
在制作 XML 解析器的过程中:
如标题所示,我已经记录了如下代码中所示的规则,但 flex 似乎错过了 一个特定的规则。
错误:Cmd Error Img
有问题的行是:
{boolean} {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}```
当明确声明的 flex 似乎无视它时,对于其他规则则不会出现此类问题。
弹性代码:
%option noyywrap
%option yylineno
string [_a-zA-Z][_a-zA-Z0-9]*
digit [0-9]
integer {digit}+
boolean "True" | "False"
text ({string}| )*
%%
. {printf("%s",yytext);}
{boolean} {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
{integer} {return INT;}
{string} {return STRING;}
%%
重新阅读问题,我认为存在术语问题。 规则是
{boolean} {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
与所有规则一样,该规则由 *pattern" 和一个动作组成。模式 {boolean}
仅包含一个宏扩展。宏扩展后,该行将不再被识别为规则因为宏定义中有杂散的空格,正如我在下面的原始答案中解释的那样:
如错误消息所示,问题出在您的 flex 文件第 22 行中的模式,其中包含 boolean
:
的宏扩展
boolean "True" | "False"
Flex 模式不得包含未加引号的空格,无论是直接输入还是通过宏输入。
如果你非要用宏,可以是:
boolean True|False
虽然没有什么可以阻止您直接在规则中插入模式:
True|False {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
在制作 XML 解析器的过程中:
如标题所示,我已经记录了如下代码中所示的规则,但 flex 似乎错过了 一个特定的规则。
错误:Cmd Error Img
有问题的行是:
{boolean} {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}```
当明确声明的 flex 似乎无视它时,对于其他规则则不会出现此类问题。
弹性代码:
%option noyywrap
%option yylineno
string [_a-zA-Z][_a-zA-Z0-9]*
digit [0-9]
integer {digit}+
boolean "True" | "False"
text ({string}| )*
%%
. {printf("%s",yytext);}
{boolean} {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
{integer} {return INT;}
{string} {return STRING;}
%%
重新阅读问题,我认为存在术语问题。 规则是
{boolean} {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
与所有规则一样,该规则由 *pattern" 和一个动作组成。模式 {boolean}
仅包含一个宏扩展。宏扩展后,该行将不再被识别为规则因为宏定义中有杂散的空格,正如我在下面的原始答案中解释的那样:
如错误消息所示,问题出在您的 flex 文件第 22 行中的模式,其中包含 boolean
:
boolean "True" | "False"
Flex 模式不得包含未加引号的空格,无论是直接输入还是通过宏输入。
如果你非要用宏,可以是:
boolean True|False
虽然没有什么可以阻止您直接在规则中插入模式:
True|False {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}