Flex返回0后如何在Bison中执行其他操作?

问题描述 投票:-1回答:1

返回yyparse()时,Bison 0功能停止读取其输入(文件或流)。

我想知道在发生之后是否还有一种方法可以执行更多命令。

我的意思是,可以在野牛文件中踩入0(或返回的某些[[token]吗?]


类似:

Flex

<<EOF>> { return 0; }

野牛

%token start start : start '0' { // Desired something else }
c++ compiler-construction c++17 bison flex-lexer
1个回答
0
投票
假设program是语法中的顶级符号。也就是说,非终结符必须与解析器的输入匹配。

当然,在输入终止之前,program也可能会被匹配多次。例如,语法可能类似于:

%start program %% program: %empty | program declaration

在该语法中,无法注入仅在完全解析输入后才执行的动作。我收集到的是您要执行的操作。

但是创建一个非终结符非常简单,在解析结束时,该终结符的动作将只执行一次。我们需要做的就是在语法顶部插入一个新的“单元产品”:

%start start %% start : program { /* Completion action */ } program: %empty | program declaration

由于start不会出现在语法的任何形式的右侧,因此只能在分析器的末尾(当解析器将%start符号简化时才将其缩减)。因此,即使生产中没有明确包含结束标记,我们也知道执行减少操作时,结束标记是超前标记。

[单位产品-右侧仅包含一个符号的产品-通常用于在解析的关键点触发动作,而以上只是该技术的一个示例。

© www.soinside.com 2019 - 2024. All rights reserved.