修改文法如下,再为其设计一个只有综合属性的SDD,完成相同的雨衣分析(同样调用过程addType填写符号表)。 D→V id V→V id, V→T T→float
时间: 2024-05-09 07:15:33 浏览: 66
SDD-软件设计说明1
修改后的文法如下:
```
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` 的类型。
阅读全文