语法返回首元素/非首元素问题:输入列表仅生成首个变量代码求助
解决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
相关产品推荐
相关产品推荐

