【问题标题】:How to do something else in Bison after Flex returns 0?Flex返回0后如何在Bison中做其他事情?
【发布时间】:2020-03-05 00:26:43
【问题描述】:
Bison yyparse() 函数在返回 0 时停止读取其输入(文件或流)。
我想知道是否有办法在它发生后执行更多命令。
我的意思是,有可能在野牛文件中踩0(或返回时抛出的一些令牌)?
类似:
弹性
<<EOF>> { return 0; }
野牛
%token start
start : start '0' {
// Desired something else
}
【问题讨论】:
标签:
c++
compiler-construction
c++17
bison
flex-lexer
【解决方案1】:
假设program 是语法中的顶级符号。也就是说,解析器的输入必须匹配非终结符。
当然,program 也有可能在输入终止之前被匹配多次。例如,语法可能类似于:
%start program
%%
program: %empty
| program declaration
在该语法中,无法注入仅在完全解析输入时才执行的操作。我猜这就是你想要做的。
但是创建一个非终端非常简单,它的动作只会在解析结束时执行一次。我们需要做的就是在语法的顶部插入一个新的“单位产生式”:
%start start
%%
start : program { /* Completion action */ }
program: %empty
| program declaration
由于start 不会出现在语法中任何产生式的右侧,它只能在解析结束时减少,此时解析器减少了%start 符号。因此,即使产生式没有明确包含结束标记,我们也知道结束标记是执行归约操作时的前瞻标记。
单元产生式 - 右侧仅包含一个符号的产生式 - 经常用于在解析的关键点触发动作,以上只是该技术的一个示例。