如何在GLR解析器中强制执行关联性规则?

时间:2012-08-07 19:26:21

标签: parsing glr

我正在写一个有趣的GLR(再次,因为我从上次尝试后了解了一些事情)。解析器现在正在工作,我正在实现消歧规则。我正在以一种似乎有效的方式处理优先权。现在我对关联性有点不知所措。

说我有这样的语法:

E <- E '+' E (rule 1)
E <- E '-' E (rule 2)
E <- '0'     (rule 3)
E <- '1'     (rule 4)

规则1)和2)具有相同的优先级和左关联性。

如果没有关联性处理,字符串'1-1 + 0'将生成两个解析树:

   1                2
  / \              / \
 /   \            /   \
2     3          4     1
|  \                   | \
4   4                  4  3

数字表示用于减少的规则。正确的解析树是第一个,因此我只想保留这个。

我想知道如何在算法上有效地检测关联性侵权。

我尝试过的一种方法是看到在第一个树中,在顶部节点,规则2在规则1的子项列表中是规则3的左边,而在第二个树中规则1是规则4的右边和因为规则2和1是左关联的,所以我只保留第一棵树。

然而,这并没有让我在更复杂的例子中走得更远。这个解决方案的局限性在于我只能根据与另一棵树的比较来丢弃树。

您认为我可以使用此方法的精炼版本找到解决方案吗?标准的做法是什么?

2 个答案:

答案 0 :(得分:0)

在我看来,最好通过融入语法规则来表达,完全解决歧义:

E <- F
E <- E '+' F
E <- E '-' F
F <- '0'
F <- '1'

当你为(G)LR设定时,应该可以同样很好地表达左右相关性。由于单位推导,解析树深度的增加可以通过适当地后处理来解决。

这将完全避免发明新机制,并利用无论如何使用的BNF的表现力。我认为这需要强有力的论据来反而使用含糊不清的符号,以及单独的如何解决的说明。

XQuery语言规范在定义过程中,从使用模糊的EBNF和额外的消歧规则(参见April 30, 2002 draft)演变为放弃后者,转而采用包含优先级和关联性的明确规则(参见August 16, 2002 draft )。作为一名实施者,我非常感谢 - 它让我的生活更轻松。

答案 1 :(得分:0)

为了在算法上执行此操作,我将创建两个组:SIMPLE,其中包括规则3和4以及COMPLEX,其中包括规则1和2.如果(COMPLEX)(子)根的最右边的子项是COMPLEX,则删除此树,因为它(部分)是右联想的。