如何获取Bison词法单元语法规则及在Bison中实时输出TOKEN匹配信息
在Bison中实现TOKEN的即时动作触发
嘿,我明白你的需求——不想改扫描器,只想在Bison里让第一个TOKEN被匹配到的时候就立刻打印,而不是等rule2归约完才执行rule1里的动作对吧?这完全可以做到,给你两种实用的方法:
方法1:给TOKEN加 inline 即时动作
直接把针对TOKEN的动作写在它在规则里出现的位置,而不是等整个rule1完成归约。修改后的语法规则如下:
rule1 : TOKEN { printf("Found TOKEN\n") ; } rule2 TOKEN { /* 第二个TOKEN的动作可以放这 */ } rule2 : ATOKEN { printf("Found ATOKEN\n") ; }
这样一来,解析器一匹配到第一个TOKEN,就会立刻执行后面花括号里的打印逻辑,不用等rule2被归约。此时对应的输出顺序就会变成:
Found TOKEN
Found ATOKEN
要是第二个TOKEN也需要即时触发动作,同样在它后面加动作块就行。
方法2:拆分规则提前归约TOKEN
把rule1拆成更细的子规则,让TOKEN的归约(以及动作执行)优先级高于rule2:
rule1 : token_segment rule2 TOKEN token_segment : TOKEN { printf("Found TOKEN\n") ; } rule2 : ATOKEN { printf("Found ATOKEN\n") ; }
Bison的LALR(1)分析器会按最左推导的顺序归约,token_segment会先被归约触发打印,之后才会处理rule2,效果和方法1完全一致。
这两种方法都是纯Bison语法层面的操作,完全不用碰扫描器代码,刚好符合你的要求。
内容的提问来源于stack exchange,提问作者3N4N
相关产品推荐
相关产品推荐

