【问题标题】:How to do something else in Bison after Flex returns 0?Flex返回0后如何在Bison中做其他事情?
【发布时间】:2020-03-05 00:26:43
【问题描述】:

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

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

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


类似:

弹性

<<EOF>>      { return 0; }

野牛

%token start

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

【问题讨论】:

    标签: c++ compiler-construction c++17 bison flex-lexer


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多