在 Flex returns 0 之后如何在 Bison 中做其他事情?

How to do something else in Bison after Flex returns 0?

The Bison yyparse() function stop to read its input (file or stream) when 0 is returned.

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

我的意思是,是否可以在 bison 文件中踩踏 0(或它的 return 抛出的一些 令牌)?


类似于:

弹性

<<EOF>>      { return 0; }

野牛

%token start

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

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

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

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

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

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

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

由于start在文法中没有出现在任何产生式的右手边,只能在解析结束时进行缩减,当解析器缩减%start符号时.因此,即使产生式没有明确包含结束标记,但我们知道结束标记是执行缩减操作时的先行标记。

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