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

语法返回首元素/非首元素问题:输入列表仅生成首个变量代码求助

解决YACC/Bison中输入列表仅生成首个变量代码的问题

你遇到的核心问题很明确:当前语法规则只对输入列表里的第一个变量触发了gen函数生成代码,后续变量虽然通过identifier_cont执行了installed,但没有生成对应的IN指令。根源在于你只在input规则里调用了一次gen,后续变量的处理逻辑里缺少代码生成的触发。

这里有个直接可行的解决方案,调整语法结构,让每个被匹配到的IDENTIFIER都触发gen调用:

修改后的语法规则

input : INPUT identifier_list SEMICOLON ;

identifier_list : IDENTIFIER 
                    { 
                        installed($1, 2); 
                        gen(IN, $1, VOID, VOID); 
                    } 
                | identifier_list COMMA IDENTIFIER 
                    { 
                        installed($3, 2); 
                        gen(IN, $3, VOID, VOID); 
                    } ;

方案说明

原来的identifier规则仅返回第一个IDENTIFIER($$ = $1),后续变量在identifier_cont里只完成了注册(installed),但没有调用gen生成输入代码;而input规则里仅对第一个变量($2)执行了一次gen,自然不会处理后续变量。

修改后,我们把变量列表拆分为identifier_list规则:

  • 匹配第一个变量时,同时执行installed和gen
  • 匹配后续逗号分隔的变量时,同样对每个新变量执行注册和代码生成

这样当输入input x, y, x;时,会依次生成三行对应代码:

IN x VOID VOID
IN y VOID VOID
IN x VOID VOID

完全解决了仅生成首个变量代码的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:27:53