parsing - S属性定义自下而上求值中栈上文法符号表示状态的意义
问题描述
我正在阅读文本:编译器:Ullman 等人的原则、技术和工具。al (Red Dragon Book) 在那里我遇到了使用解析器对S-attributed
语法进行自下而上评估的概念。LR
现在我从本书的前几章中学到的是,LR
解析器使用堆栈来跟踪 DFA(LR
项目的规范集合)的状态来模拟 DFA。但是在下面给出的摘录中,他们似乎没有将状态编号(例如1
or 2
...)推入堆栈,而是使用某种unique grammar symbol which covers the state
. 我不太明白这种新方法如何保留通常的行为。
解析器堆栈上的综合属性
S 属性定义的翻译器通常可以在
LR
-parser 生成器的帮助下实现。根据S-attributed
定义,解析器生成器可以构造一个翻译器,在解析输入时评估属性。自底向上解析器使用堆栈来保存有关已解析的子树的信息。我们可以使用解析器堆栈中的额外字段来保存合成属性的值。图 5.15 显示了一个解析器堆栈的示例,其中一个属性值具有空间。让我们假设,如图所示,堆栈是由一对数组
state
和实现的val
。每个状态条目都是指向LR(1)
解析表的指针(或索引)。(注意,语法符号隐含在状态中,不需要存储在堆栈中。)然而,通过放置在解析堆栈上时覆盖的唯一语法符号来引用状态是很方便的。如果第i
th 个状态符号是A
,那么val[i]
将保存与 this 对应的解析树节点关联的属性的值A
。堆栈的当前顶部由指针顶部指示。我们假设在每次归约之前对合成属性进行评估。假设语义规则
A.a := f(X.x, Y.y, Z.z)
与产生式相关联A -> XYZ
。BeforeXYZ
归结为A
,属性的值Z.z
是 inval[top]
,Y.y
in的值val[top-1]
,X.x
in的值val[top-2]
。如果符号没有属性,则val
数组中的相应条目是未定义的。归约后,top
减2
,状态覆盖A
放入state[top]
(即 whereX
was),合成属性的值A.a
放入val[top]
。
解决方案
推荐阅读
- azure-application-gateway - Azure 应用程序网关中的静态 IP 地址
- sql - PostgreSQL - 在 SELECT 查询中将一列中的多行连接成一个字符串
- python - torchtext BucketIterator 最小填充
- lua - Roblox Studio Lua:商店屏幕 Gui:按钮未显示
- c++ - 在字符串c ++中存储多个十六进制值
- python - Python Pandas 有条件的只执行第一个“If”语句
- python - 检查元素与 BeautifulSoup/Selenium 返回的元素不同
- coldfusion - 是否有与单个 ColdFusion 请求相关的易于访问的唯一 ID?
- php - PHP - 带有特殊字符的 utf8_decode 是小写的
- python - python:用另一个列表中的项目索引替换列表项目