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

Bison汇编解析中add非终结符需显式定义吗?语义规则链合规吗?

Bison汇编指令解析问题解答

问题背景

我正在用Bison编写汇编指令解析器,核心代码片段如下:

text
    : text NEWLINE Instruction
    | Instruction
    ;

Instruction
    : r-type
    {
        instruction.format = IF_R;
        instruction.opcode = 0b0110011;
    }
    ;

r-type
    : add
    {
        instruction.funct3 = 0x0;
        instruction.funct7 = 0x00;
    }
    ;

add
    : ADD REGISTER COMMA REGISTER COMMA REGISTER
    {
        instruction.rd = $2;
        instruction.rs1 = $4;
        instruction.rs2 = $6;
    }
    ;

假设instruction为作用域内可见的结构体,所有大写形式的Token均来自词法分析器。现有两个疑问:

  1. add非终结符是否需要添加$$ = *something*;这样的语义规则?当前写法是否可行?
  2. 在多层非终结符的推导链中设置多条语义规则是否合规?

问题1解答

不需要添加$$ = ...;,当前写法完全可行。
Bison中$$的作用是向上层非终结符传递语义值,只有当你需要把add解析得到的特定数据(比如自定义的操作码结构体、参数集合)传递给上层的r-type或Instruction时,才需要为add设置$$。
你的代码逻辑是直接修改共享的instruction结构体,所有语义动作都是直接对该结构体赋值,没有需要向上传递的中间值,因此完全不需要设置$$。

问题2解答

完全合规,且这种写法是Bison开发中的常见实践。
Bison允许在每一条语法推导规则后添加语义动作,执行顺序为自底向上:即先执行最底层add的语义动作(填充rd/rs1/rs2),再执行r-type的动作(设置funct3/funct7),最后执行Instruction的动作(设置format/opcode)。这个顺序正好匹配你填充instruction结构体的逻辑,不会出现字段未初始化或被错误覆盖的问题(前提是instruction在使用前已正确初始化)。


内容的提问来源于stack exchange,提问作者SK OG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:57:51