我相信读它的每个人都熟悉其他模糊不清的问题。所以我会跳过解释。 我在一本编译器书(dragon book)上找到了代表IF和ELSE的不含糊语法。这里是。语法LL(1)悬于其他和常见的左前缀
stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp then stmt | if exp then matched_stmt else open_stmt
的问题是:
open_stmt->如果EXP然后stmt是|如果EXP然后matched_stmt其他open_stmt
为了使我的工作语法上的LL(1)语法,我需要消除左共同的前缀,而在这种情况下,离开共同的前缀是:
如果EXP然后
当我尝试它的工厂然后重新变得模糊,这是我的尝试。
stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp thenO'
O'->stmt | matched_stmt else open_stmt
这是不明确的,任何人都可以帮助我使它不ambigous和没有共同的左前缀?非常感谢你
认为必须处理if和else的语法不能是LL(1)的语法是很奇怪的。我尝试了很多东西,但是eveytime的解析表格变得模糊(两个不同的作品会变成相同的终端值)。我想那就是了,非常感谢。 –
@BrunoBraga为什么必须是LL(1)? LL(1)是一组非常严格的语法;有许多构念在LL(1)中不能充分表达。一个简单的左关联表达式语法不能正确地写入LL(1);您需要重新调整生成的右关联分析树以获取正确的关联性。在实践中,if-else模糊不严重,因为(正如我所提到的)递归下降解析器可以很容易地做出正确的决定,从而避免模糊性,大多数LL解析器生成器会正确处理。但个人而言,我会进行LR解析。 – rici
没理由,我只是想知道这是否可行,因为我目前正在学习LL(1)语法。 –