You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:05:43