在制作XML解析器的过程中:
如标题所示,我已经记录了以下代码中所示的规则,但是flex似乎错过了一个特定的规则。
错误:Cmd错误图片
有问题的行是:
{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"
伸缩模式可能不包含无引号的空格,无论是直接输入还是通过宏输入。
如果您坚持使用宏,则可能是:
boolean True|False
尽管没有什么可以阻止您将模式直接插入规则中:
True|False {yylval.booleanval = strdup(yytext); if(err==1){printf("\t\t\t\t\t\t");}; return BOOLEAN;}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句