首页 > 解决方案 > Flex返回0后如何在Bison中做其他事情?

问题描述

Bisonyyparse()函数在返回时停止读取其输入(文件或流)0

我想知道是否有办法在它发生后执行更多命令。

我的意思是,是否可以在野牛文件中踩踏0(或返回时抛出的一些令牌)?


就像是:

柔性

<<EOF>>      { return 0; }

野牛

%token start

start   : start '0' {
           // Desired something else
        }

标签: c++compiler-constructionc++17bisonflex-lexer

解决方案


假设program是文法中的顶级符号。也就是说,解析器的输入必须匹配非终结符。

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

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

在该语法中,无法注入仅在完全解析输入时才执行的操作。我认为这就是你想要做的。

但是创建一个非终端非常简单,它的动作只会在解析结束时执行一次。我们需要做的就是在语法的顶部插入一个新的“单位产生式”:

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

由于start不会出现在语法中任何产生式的右侧,因此它只能在解析结束时进行归约,此时解析器将%start符号归约。因此,即使产生式没有明确包含结束标记,我们也知道结束标记是执行归约操作时的前瞻标记。

单元产生式 - 右侧仅包含一个符号的产生式 - 经常用于在解析的战略点触发动作,以上只是该技术的一个示例。


推荐阅读