Parsing LL1和用于悬挂else的明确语法

Parsing LL1和用于悬挂else的明确语法,parsing,context-free-grammar,ambiguity,dangling-else,Parsing,Context Free Grammar,Ambiguity,Dangling Else,我正在尝试使用Flex for scanner和一个名为PGen的特殊工具来定义语法,编写一个简单的编译器 现在,我正试图解决悬空的语法问题。 我已经找过了 这是一个有悬而未决的else问题的语法: S → if E then S | if E then S else S | OTHER 这是解决此问题的语法(通过): 但这种语法仍然不是LL1,而且仍然模棱两可 当我试图解决这个含糊不清的问题并使其成为LL1时,我再次面临着悬而未决的else问题 有谁能帮我找到嵌套if的明确LL1语法

我正在尝试使用Flex for scanner和一个名为PGen的特殊工具来定义语法,编写一个简单的编译器

现在,我正试图解决悬空的语法问题。 我已经找过了

这是一个有悬而未决的else问题的语法:

S → if E then S
  | if E then S else S
  | OTHER
这是解决此问题的语法(通过):

但这种语法仍然不是LL1,而且仍然模棱两可

当我试图解决这个含糊不清的问题并使其成为LL1时,我再次面临着悬而未决的else问题

有谁能帮我找到嵌套if的明确LL1语法吗


我读过这本语法书,它不能变成LL1。但我不知道如何解决这种歧义。

MIF和UIF的语法是明确的。你怎么会不这么想?然而,它肯定不是LL(1),我严重怀疑该语言是否存在LL(1)语法。(阿霍、塞蒂和乌尔曼就是这么说的,所以这一定是真的:))。正如他们所指出的,即使是模棱两可的,解析也很容易。但这无助于使用LL(1)工具生成解析器。你为什么不使用像bison这样的LALR(1)工具?@rici谢谢你的评论,亲爱的。这是一个应该由名为PGen的工具完成的项目。它是由一位伊朗教授开发的,使用语法图来制作解析器。什么是LALR(1)?LALR解析可以处理一组不同且更有用的语言。如果您需要使用一个特定的工具,并且该工具是LL(1),并且它需要一个明确的语法,那么我认为您运气不好。虽然这种语言很容易解析。您只需始终移动
else
(如果有)。
S → MIF            /* all then are matched */
  | UIF            /* some then are unmatched */
MIF → if E then MIF else MIF
    | OTHER
UIF → if E then S
    | if E then MIF else UIF