修改文法如下,再为其设计一个只有综合属性的SDD,完成相同的语义分析(同样调用过程addType填写符号表)。 D→V id V→V id, V→T T→float
时间: 2024-04-30 19:20:03 浏览: 115
文法修改如下:
```
D → V id
V → V id
V → T
T → float
```
设计SDD如下:
```
D.type = V.type = T.type = float
D.syn = V.syn = addType(id.lexval, D.type) // 将D和V的类型加入符号表,此处id为继承属性
V.inh = T.type // 将V的继承属性设置为T的类型,以便继续传递属性
T.inh = T.type // 将T的继承属性设置为T的类型,以便继续传递属性
```
解释如下:
- `D.type = V.type = T.type = float`:将D、V、T的类型属性都设置为float。
- `D.syn = V.syn = addType(id.lexval, D.type)`:将D和V的类型加入符号表,并将D和V的综合属性设置为加入符号表的结果。此处id为继承属性,表示D和V所定义的变量名。
- `V.inh = T.type`:将V的继承属性设置为T的类型,以便在V规约之前将T的类型属性传递给V。
- `T.inh = T.type`:将T的继承属性设置为T的类型,以便在T规约之前将T的类型属性传递给V。由于T没有子节点,所以不需要设置T的综合属性。
此SDD实现了与上一个SDD相同的功能,即将变量名和类型加入符号表。由于只有综合属性,这里并不需要对继承属性进行计算。
相关问题
修改文法如下,再为其设计一个只有综合属性的SDD,完成相同的雨衣分析(同样调用过程addType填写符号表)。 D→V id V→V id, V→T T→float
修改后的文法如下:
```
D → V id
V → V id {addType(id.type)}
| T {addType(T.type)}
T → float {T.type=float}
```
其中,`{addType(id.type)}` 表示添加 `id` 的类型到符号表中,`{T.type=float}` 表示将 `T` 的类型设为 `float`。这里的 SDD 只有综合属性,即对语法分析树的上行遍历和下行遍历都进行属性计算。
下面是对该文法的 SDD 实现:
```python
def D():
if lookahead == 'float':
T()
else:
V()
match('id')
def V():
if lookahead == 'id':
addType(lookup(lexeme).type) # 综合属性,从符号表中获取类型
match('id')
while lookahead == 'id':
addType(lookup(lexeme).type) # 综合属性,从符号表中获取类型
match('id')
else:
T()
def T():
match('float')
T.type = 'float' # 综合属性,设定类型为 float
```
这里的 `lookup()` 函数是从符号表中查找某个标识符的类型,并返回该符号表项。`addType()` 函数是将当前处理的标识符的类型添加到符号表中。`T.type` 是一个综合属性,表示 `T` 的类型。
1)(4分)为下列变量声明语句文法设计一个SDD,为标识符id确定数据类型,并将数据类型 填入其对应符号表项中(调用过程addType)。 D→TV V→id,V|id T→ float (2)(4分)修改文法如下,再为其设计一个只有综合属性的SDD,完成相同的语义分析(同样 调用过程addType填写符号表)。 D→V id V→V id, V→T T→ float (3)(4分)分别利用(1)(2)的SDD对句子float a,b,c进行语义分析,画出对应的注释语法分析树 和依赖图。
(1) SDD:
D → T{addType(T.type)} V{id.type=T.type; addType(id.type)}
V → id{id.type=lookupType(id.name)}
| V{id.type=V1.type} , id{id.type=lookupType(id.name)}
T → float{T.type=float}
(2) SDD:
D → V{id.type=lookupType(id.name)}
id{id.type=V.type; addType(id.type)}
V → V{id.type=V1.type} , id{id.type=lookupType(id.name)}
| T{V.type=T.type}
T → float{T.type=float; addType(float)}
(3) 对句子float a,b,c进行语义分析的注释语法分析树和依赖图如下:
注释语法分析树:
![image.png](attachment:image.png)
依赖图:
![image-2.png](attachment:image-2.png)
阅读全文