如何在Bison编译器中实现多指令?单指令可行多指令失效求助
解决自研编译器多指令解析问题
我一眼就看出问题出在你的语法规则定义上啦——当前的规则只支持单条带分号的表达式作为整个程序的入口,完全没考虑多条指令的情况!
原语法的核心问题
你当前的起始符号是expression,而它的规则是:
expression : first ';' ;
这意味着解析器只会把单个表达式加分号当作合法的程序输入。当你输入expr1; expr2;时,解析器处理完expr1;后,发现后面还有expr2;,但没有任何规则告诉它该怎么处理这部分内容,自然就无法正常工作了。
修改后的语法方案
要支持多指令,你需要定义一个能容纳多条语句序列的顶层非终结符,然后把起始符号指向它。具体修改如下:
%start program %% program : program expression // 匹配已有程序 + 新语句 | expression // 匹配单条语句作为程序起点 ; expression : first ';' ; first : first '+' second | first '-' second | second ; second : second '*' number | second '/' number | number number : NUM_INT ;
为什么这样改?
- 新的起始符号
program通过递归规则,允许解析器匹配一条或多条expression(也就是带分号的指令) - 当输入
expr1; expr2;时,解析器会先把expr1;当作初始的program,然后再把expr2;作为新的expression追加进去,最终形成完整的多指令程序结构
这样修改后,你的编译器就能正确处理多指令输入啦!
内容的提问来源于stack exchange,提问作者toha
相关产品推荐
相关产品推荐

