使用Flex/Bison开发算术表达式求值程序:空格无效问题咨询
解决Flex中空白字符被判定为无效字符的问题
你的问题根源在于当前Lex规则里的通配符.会匹配所有未被前面规则覆盖的字符,包括空格(' '),然后把它返回给Bison,导致程序认为这是无效字符。要解决这个问题,只需要在Lex文件中添加专门匹配空白字符的规则,让Flex直接忽略它们即可。
具体修改步骤
在你的Lex规则中,添加一条匹配空格和制表符的规则,放在通配符
.规则的前面(因为Lex会按规则顺序优先匹配):[ \t]+ ; /* 忽略空格和制表符 */这里的动作
;表示不执行任何操作,直接跳过这些空白字符。修改后的完整Lex代码示例:
%{ #include<math.h> extern yylval; %} %% [0-9]+ {yylval=atoi(yytext);return NUM;} [+] {return '+';} [-] {return '-';} [*] {return '*';} [/] {return '/';} [ \t]+ ; /* 忽略空格和制表符 */ \n return 0; . {return yytext[0];} %%
额外说明
- 如果还需要忽略其他空白字符(比如换行符,不过你的代码里已经单独处理了
\n),可以把规则改成[ \t\n]+,但注意不要和你已有的\n规则冲突。 - 规则的顺序很重要:一定要把空白字符的规则放在通配符
.规则之前,否则.会先匹配空格,导致无效字符的问题依然存在。
内容的提问来源于stack exchange,提问作者Avani Ranade
相关产品推荐
相关产品推荐

