-->

Flex和野牛文件标记结束(只适用于没有它)(END OF FILE token with flex

2019-08-02 05:46发布

好了,这是一种奇怪的问题,因为我在这里工作,我希望它的方式。 我在做什么是写一个演算表达式解析器。 因此,一个表达式可以是以下四种情况之一:

  • 变量
  • 不变
  • (表达式表达)
  • (拉姆达variable.expression)

现在,你可以看到,最后两个词语具有在其中表达。 我试图做的是确定整体表现,所以我可以报告它是哪种类型。 因此,例如,表达式((拉姆达X。(F1 X))×100)是整体的组合。 我的想法是从柔性返回END令牌,当它到达文件的末尾。 我的代码如下所示:

overallexpr: combo END { printf(" The overall expression is a combination\n"); } |
         constant END { printf(" The overall expression is a constant\n"); } |
         VARIABLE END { printf(" The overall expression is a variable\n"); } |
         l_expr END { printf(" The overall expression is a lambda expression\n"); }
;

expr: combo | constant | VARIABLE | l_expr
;

combo: LPARENS expr expr RPARENS
;

constant: FUNCTION | NUMBER
;

l_expr: LPARENS LAMBDA VARIABLE DOT expr RPARENS
;

如果我把END令牌之后像组合END,而不是只组合overallexpr四种可能性,这是行不通的。 但最终的令牌解析器好评。 如果我打印的每个令牌,因为它是读取(与变量,函数和数值),它看起来像这样

LPARENS  LPARENS  LAMBDA  VARIABLE x  DOT  LPARENS  FUNCTION f1  VARIABLE x  RPARENS  RPARENS  NUMBER 100  RPARENS  END Sorry, Charlie

这可能是很难说,但这应该工作。 该组合与RPARENS结束后它有一个END令牌的权利。 不过,这并不评估作为整体表达。 但是,如果我拿出END令牌,似乎每一次工作。 我总是得到打印的总体信息,即使overallexpr和expr的作品是完全一样的。 输出是相同的,除了它的最后一个说“整体表达式是一个组合的” END令牌之前。 所以我的问题是为什么呢? 难道野牛永远只是尝试早期的作品第一次? 而为什么会没有工作进行到底,但不呢? 尤其是,因为你可以看到END令牌右后说,这是一个组合。 我只是想获得更好的理解野牛是如何工作的。

Answer 1:

这是一个有点很难说是怎么回事,没有看到你的代码(我真的不希望通过它来趟,反正),但我会大胆地猜测:我的猜测是,你要替换的标准函数yylex EOF指示(即返回0)与END令牌。 如果野牛解析器永远不会看到一个EOF,它永远不会完成解析。

实际上,野牛创建一个特殊的生产自身所有的:

__parse__: __start__ $;

解析是(实际上未命名)生产, __start__是什么您已经声明为%start (或第一个非终端,如果你不明确声明它)。 在你的情况,我想这是overallexpr$是通常用于表示的EOF标记符号。

现在,当你野牛解析器动作发生的呢? 虽然在某些情况下,它们可以发生,你认为他们会(在生产的最后一个令牌之后即立即),他们通常不会发生,直到解析器需要在以下令牌偷看。 它允许这样做; 这就是为什么它被称为LALR(1)解析器:将1是它允许在决定到底该怎么用它已经得到了那些之前做一下未来的令牌的数量。 它几乎总是需要这些信息,并经常工作,就好像它没有,即使它看起来你和我,事实并非如此。

所以,在所有的可能性,解析器实际上不会做overallexpr减少-或者,换句话说,它不会执行与关联的操作overallexpr规则-直到说服本身最终的文件标记为下一个标记。

现在,如果你离开你的END令牌出了规则和词法分析器实际上返回EOF,然后野牛做的减少,当它看到EOF。



文章来源: END OF FILE token with flex and bison (only works without it)