问题描述
我目前正在研究某种预处理器,并且正在使用 lex 和 bison 来创建词法分析器和解析器部分。
我当前的实现在处理空格时遇到了问题。我的第一个解决方案是创建一个使用 [ \t]+ /* do nothing */
忽略空格的 flex 规则,这解决了一些问题,其中删除了所有空格,但也删除了关键字之间的空格,因此 Boxdown
与 Box down
相同,其中不应该。
我的下一个解决方案是返回一个空格标记,但它不支持前导和尾随空格,现在我需要修改我的所有野牛规则以匹配它需要空格的地方以及一些可选的部分,例如数学表达式。
是否有更标准、更整洁的方法来实现这一点,因为我在网上找到的大多数示例都没有使用专用令牌作为空格?
这是我的词法分析器的规则:
"down" { strcpy(yylval.s,yytext); return DIR; }
"Box" { strcpy(yylval.s,yytext); return PRIM; }
\n { return EOL; }
[ \t]+ { return WS; }
. { ECHO; }
这里是解析器的一个片段:
%token <s> PRIM DIR
%token EOL WS
program: statement
| program EOL statement
;
statement: prim_stmt
;
primt_stmt: PRIM { foo($1,""); }
| PRIM WS DIR { foo($1,$3); }
;
编辑: 通过添加这 2 个词法分析器规则,我设法使其允许尾随和前导空格。
^[ \t]+ /* do nothing */
[ \t]+/\n /* do nothing */
但我仍然需要手动更改所有野牛规则以适应 WS
令牌
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)