c++ - Flex返回0后如何在Bison中做其他事情?
问题描述
Bison
yyparse()
函数在返回时停止读取其输入(文件或流)0
。
我想知道是否有办法在它发生后执行更多命令。
我的意思是,是否可以在野牛文件中踩踏0
(或返回时抛出的一些令牌)?
就像是:
柔性
<<EOF>> { return 0; }
野牛
%token start
start : start '0' {
// Desired something else
}
解决方案
假设program
是文法中的顶级符号。也就是说,解析器的输入必须匹配非终结符。
当然,也有可能program
在输入终止之前匹配多次。例如,语法可能类似于:
%start program
%%
program: %empty
| program declaration
在该语法中,无法注入仅在完全解析输入时才执行的操作。我认为这就是你想要做的。
但是创建一个非终端非常简单,它的动作只会在解析结束时执行一次。我们需要做的就是在语法的顶部插入一个新的“单位产生式”:
%start start
%%
start : program { /* Completion action */ }
program: %empty
| program declaration
由于start
不会出现在语法中任何产生式的右侧,因此它只能在解析结束时进行归约,此时解析器将%start
符号归约。因此,即使产生式没有明确包含结束标记,我们也知道结束标记是执行归约操作时的前瞻标记。
单元产生式 - 右侧仅包含一个符号的产生式 - 经常用于在解析的战略点触发动作,以上只是该技术的一个示例。
推荐阅读
- excel - 使用 VBA 将多个 Excel 工作簿从特定文件夹导入单个工作表
- winapi - SAFEARRAY 数据到无符号字符*
- assembly - 我怎样才能更有效地编写这段代码?
- symfony - Symfony 4 表单、自定义 DTO 和实体关系
- java - 如何在Java中对同一包的类使用静态导入
- angular - Angular 清除订阅的更好方法
- java - 如何使用 Picasso 使用动态 URL 缓存来自 S3 存储桶的图像?
- angular - Angular-Router:Angular Application 子目录中的 Wordpress
- python - 如何在给定张量流中每个值的概率的情况下对张量值进行采样?
- vim - 在 vimscript 的光标后插入文本块