在 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
符号时.因此,即使产生式没有明确包含结束标记,但我们知道结束标记是执行缩减操作时的先行标记。
单元产生式——右侧仅包含一个符号的产生式——经常用于在解析的战略点触发动作,以上只是该技术的一个示例。
The Bison
yyparse()
function stop to read its input (file or stream) when0
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
符号时.因此,即使产生式没有明确包含结束标记,但我们知道结束标记是执行缩减操作时的先行标记。
单元产生式——右侧仅包含一个符号的产生式——经常用于在解析的战略点触发动作,以上只是该技术的一个示例。