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进行语义分析,画出对应的注释语法分析树 和依赖图。
时间: 2023-06-18 20:07:18 浏览: 147
(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)
相关问题
为下列变量声明语句文法设计一个SDD,为标识符id确定数据类型,并将数据类型填入其对应符号表项中(调用过程addType)。 D→TV V→id,V| id T→float
SDD设计如下:
```
D → T V { addType(V.type) }
V → id { V.type = lookupType(id) }
| V ',' id { addType(V.type); V.type = lookupType(id) }
T → float { T.type = float }
```
其中,`addType(type)` 表示将 `type` 添加到符号表中,`lookupType(id)` 表示查找符号表中 `id` 对应的数据类型。在这里,我们假设符号表已经被初始化且具有 `lookupType` 和 `addType` 两个函数。
已知文法 exp→ exp + factor | factor, factor → (exp)|number;请用BNF消除左递归并且设计一个消除左递归后的文法的L-SDD来求表达式的值
消除左递归后的文法为:
exp → factor exp'
exp' → + factor exp' | ε
factor → (exp) | number
其中,exp → factor exp' 是为了消除左递归,exp' → ε 是为了处理 exp 后面没有加号的情况。
L-SDD 代码如下:
```
exp → factor { $$ = $1; }
exp' → + factor { op = '+'; } exp' { $$ = $3 + $2; }
exp' → ε { $$ = 0; }
factor → ( exp ) { $$ = $2; }
factor → number { $$ = atoi($1); }
```
其中,exp 产生式的语义动作计算 factor 的值,并将其赋值给 $$. exp' 产生式的第一个语义动作记录加号的操作符,并将 factor 的值赋值给 $2,exp' 的值赋值给 $3;第二个语义动作将 $2 和 $3 相加并将结果赋值给 $$. factor 产生式的第一个语义动作返回括号内表达式的值,第二个语义动作将数字字符串转换为整型并返回。
阅读全文