问题描述
我正在阅读文本:编译器:原理、技术和工具,作者是 Ullman 等。 al (Red Dragon Book) 在那里我遇到了使用 S-attributed
解析器对 LR
语法进行自底向上评估的概念。现在我从本书前面的章节中了解到,LR
解析器使用堆栈来跟踪 DFA(LR
项的规范集合)的状态来模拟DFA。但是在下面给出的摘录中,他们似乎没有将状态编号(例如 1
或 2
... 推送到堆栈上,而是使用某种 {{ 1}}。我不太明白这种新方法中如何保留通常的行为。
解析器堆栈上的综合属性
S 属性定义的翻译器通常可以在 unique grammar symbol which covers the state
解析器生成器的帮助下实现。根据 LR
定义,解析器生成器可以构建一个翻译器,在解析输入时评估属性。
自底向上的解析器使用堆栈来保存有关已解析的子树的信息。我们可以在解析器堆栈中使用额外的字段来保存合成属性的值。图 5.15 显示了一个解析器堆栈的示例,其中一个属性值有空间。让我们假设,如图所示,堆栈由一对数组 S-attributed
和 state
实现。每个状态条目都是一个指向 val
解析表的指针(或索引)。 (请注意,语法符号隐含在状态中,不需要存储在堆栈中。)但是,通过放置在解析堆栈上时覆盖的唯一语法符号来引用状态是很方便的。 如果第 LR(1)
个状态符号是 i
,则 A
将保存与此 val[i]
对应的解析树节点关联的属性值。
当前栈顶由指针top指示。我们假设在每次减少之前评估合成属性。假设语义规则 A
与产生式 A.a := f(X.x,Y.y,Z.z)
相关联。在 A -> XYZ
降为 XYZ
之前,属性 A
的值在 Z.z
中,val[top]
的值在 Y.y
中,而val[top-1]
中的 X.x
。如果符号没有属性,则 val[top-2]
数组中的相应条目未定义。减少后,val
减少top
,覆盖2
的状态被放入A
(即state[top]
所在的位置),并且综合属性 X
的值放在 A.a
中。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)