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

Parsing 如何在GLR解析器中强制执行关联性规则?,parsing,glr,Parsing,Glr,我写GLR是为了好玩(同样,因为自从上次尝试以来,我了解了一些事情)。解析器正在工作,我正在实现消歧规则。我处理优先权的方式似乎很有效。现在我对联想性有点不知所措 假设我有这样的语法: E <- E '+' E (rule 1) E <- E '-' E (rule 2) E <- '0' (rule 3) E <- '1' (rule 4) 其中数字表示用于减少的规则。正确的解析树是第一个,因此我只想保留这一个 我想知道如何通过算法有效地检测关联性侵犯

我写GLR是为了好玩(同样,因为自从上次尝试以来,我了解了一些事情)。解析器正在工作,我正在实现消歧规则。我处理优先权的方式似乎很有效。现在我对联想性有点不知所措

假设我有这样的语法:

E <- E '+' E (rule 1)
E <- E '-' E (rule 2)
E <- '0'     (rule 3)
E <- '1'     (rule 4)
其中数字表示用于减少的规则。正确的解析树是第一个,因此我只想保留这一个

我想知道如何通过算法有效地检测关联性侵犯

我尝试过的一种方法是,在第一棵树的顶部节点,规则2在规则1的子级列表中位于规则3的左侧,而在第二棵树中,规则1在规则4的右侧,因此,由于规则2和1是左关联的,我只保留第一棵树

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


您认为我可以使用这种方法的改进版本找到解决方案吗?标准的做法是什么?

在我看来,最好将其整合到语法规则中,完全解决歧义:

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

E要从算法上做到这一点,我将分成两组:简单组包括规则3和4,复杂组包括规则1和2。如果(复杂)(子)根的最右边的子级是复杂的,则删除此树,因为它(部分)是右关联的

我所看到的唯一支持歧义的论点是,对编写语法的人来说,歧义更容易!我必须承认我很喜欢这个论点。如果可以自动消除歧义(比如:默认情况下,所有规则都保留了关联性,用户可以覆盖它。)我希望这样。另外,你能总是将优先规则整合到语法中吗?非结合性规则也很好。。。
E <- F
E <- E '+' F
E <- E '-' F
F <- '0'
F <- '1'