Parsing 解决/减少冲突

Parsing 解决/减少冲突,parsing,lr,shift-reduce-conflict,reduce-reduce-conflict,Parsing,Lr,Shift Reduce Conflict,Reduce Reduce Conflict,我们有一个CFG语法,我们构造了LR(1)解析表。我们看到解析表上的一个单元格有一个reduce-reduce冲突。是否有可能通过在每一步使用更多的前瞻输入符号来解决这一冲突?我这样问是因为我认为通过增加前瞻符号,我们(并非总是)只能解决移位-减少冲突。我的意思是减少冲突中的额外前瞻对我们没有帮助。我说的对吗?通过更多的前瞻性,可能会解决reduce/reduce冲突。也可以通过重构来解决这个问题 这实际上取决于冲突的性质。没有一般程序 可通过额外前瞻解决的reduce/reduce冲突示例:

我们有一个CFG语法,我们构造了LR(1)解析表。我们看到解析表上的一个单元格有一个reduce-reduce冲突。是否有可能通过在每一步使用更多的前瞻输入符号来解决这一冲突?我这样问是因为我认为通过增加前瞻符号,我们(并非总是)只能解决移位-减少冲突。我的意思是减少冲突中的额外前瞻对我们没有帮助。我说的对吗?

通过更多的前瞻性,可能会解决reduce/reduce冲突。也可以通过重构来解决这个问题

这实际上取决于冲突的性质。没有一般程序

可通过额外前瞻解决的reduce/reduce冲突示例:

A → something
B → A
C → A
D → B u v
D → C u w
这里,
D
的最后两个结果是明确的,但是当看到
u
时,无法做出将
A
减少到
B
C
的决定。不过,再加一个前瞻符号就可以了,因为第二个下一个符号决定了缩减

重构解决方案:

Au → A u
Bu → Au
Cu → Au
D  → Bu v
D  → Cu w

通过将B/C选择推迟一个令牌,我们成功地消除了reduce/reduce冲突。请注意,即使
u
不是单个令牌,此解决方案也会起作用;例如,它可以通过非终端。因此,该模型可能适用于仅增加前瞻性还不够的情况。

通常,任何冲突都可以通过额外的前瞻性解决。在极端情况下,您需要读取到文件的末尾。转移/减少和减少/减少冲突之间没有显著差异。他们的决心有点相似

我写了一篇关于解决冲突的文章。它提出了一种能够找出冲突原因的方法。在某些情况下,这有助于重构语法或定义解析策略

请看一看:


如果您有问题,请告诉我。

我在这里没有看到很多这样的问题。也许你在计算机科学方面会更走运()?我的问题是这个语法S->+SS |+S | SS | a在这个语法中我们怎么能找到更多的lookaheads?你的例子很简单(而且很有帮助)。我构造了LR(1)表,在一个单元格中,我有3个动作,shift、reduce和reduce。有没有一种方法可以在不重构的情况下解决这些冲突例如(我的意思是不重构):我相信语法描述了一种常规语言,所以也许可以通过选择一种可能的操作来解决冲突,但如何确定呢?@IakobFokas:语法在不同方面都是模糊的,而且,无论您对一个不明确的语法进行了多少前瞻,您都无法为它生成一个无冲突的解析器。因此,您的第一步将是消除歧义。你是正确的,语法识别的语言是规则的;如果我没有弄错的话,它是
(++a)*a
。我不认为正则表达式对解析语言有用,因为所有的结构都被删除了,但也不是一个模棱两可的语法。@Kirill Kobelev在他的回答中写道,“任何冲突都可以通过额外的前瞻性解决…”你说“无法为不明确语法生成无冲突解析器,无论您对其进行了多大程度的前瞻" . 什么是真的?@Iakob:我说的。模棱两可的语法允许多次解析,这意味着会有冲突。不是这样。如果语法模棱两可,那么再多的前瞻也无法解决冲突,因为存在多个可能的解析。任何解析都具有相同的值。解析具有语义的编程语言是不同的。对于一个完整的程序,只有一个解析是正确的。