我写一个 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 是左关联的我只保留第一棵树。
然而,在更复杂的例子中,这并没有让我走得太远。此解决方案的一个限制是我只能根据与另一棵树的比较来丢弃树。
您认为我可以使用这种方法的改进版本找到解决方案吗?标准的做法是什么?