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均来自词法分析器。现有两个疑问:
add非终结符是否需要添加$$ = *something*;这样的语义规则?当前写法是否可行?- 在多层非终结符的推导链中设置多条语义规则是否合规?
问题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
相关产品推荐
相关产品推荐

