我正在尝试使用用于扫描仪的 Flex 和一个名为 PGen 的特殊工具来定义语法来编写一个简单的编译器。
现在,我正在尝试解决悬而未决的明确语法问题。我已经搜索过了。
这是一个带有悬空 else 问题的语法:
S → if E then S
| if E then S else S
| OTHER
这是解决此问题的语法(通过Berkeley 的幻灯片):
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
但是这个语法仍然不是 LL1 并且仍然是模棱两可的。
当我试图解决这种歧义并将其设为 LL1 时,我再次面临悬而未决的 else 问题。
谁能帮我找到一个明确的 LL1 嵌套 if 语法?
我在 Stack Overflow 上的问答中读到此语法不能成为 LL1。但我无法意识到如何解决这种歧义。