许多标准编译器设计文本提到构建增强语法作为LR解析的第一步。

通常是

  1. 在任何生产右手的起始符号出现的情况下是必需的
  2. 当开始符号的RH有多个生产时,需要。
  3. 我认为,如果在解析表的动作部分的DFA的第一个状态,我们会在“$”中提供“成功”,我们不需要增强语法。这是正确的还是我错过了什么?

    编辑:以下是我认为我们可以作为成功声明解析:

    考虑s - > .a 在我们减少'A'而不是从我们当前的状态转到堆栈的TTOP,我们可以简单地查看'$'和输出成功

有帮助吗?

解决方案

一旦我们有一个解析表,我们就可以解析(或拒绝)任何句子而不对语法引用任何句子。所以在那时,语法是或未增强的事实基本上是有没有意义的。 (如果在增强的开始符号的唯一生产中附加了用户语义行动,则会有意义,但这似乎是不可能的,因为增强的开始符号的生产是自动添加的,而不是由用户自动添加。)

并且确实如此,大多数解析器生成器实际上通过使输入端标记的 shift 接受动作来优化它们的解析表,而不是等待增强的开始符号的生产减少。通过该优化,增强的起始符号从未在解析器操作中使用,因此符号本身不需要。如果解析器生成器增强了语法,则该增强基本上已经撤消,除了一个小的谜团:什么是可以移位的这个输入端符号?它不会出现在任何可还原右侧。

无论如何,这一点是它没有解析,这需要增强语法;增强语法是创建解析表所必需的。必要的情况基本上是存在与输入结束符号寻亮的一些非默认减少动作的情况。只有通过分析包括增强开始符号的生产的状态,只能正确地将减少操作正确添加到解析表中。

(严格地说,如前所述,除非它存在于语法中的某些右手侧,否则输入符号末端符号无法真正存在,直到它语法是增强的;增强不仅添加了额外的非终端,它也会添加输入端符号本身。)

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top