实现一个简单的编程语言的语法制导翻译和中间代码生成。该编程语言由一个名为 f 的函数构成函数名固定为 f函数需要至少 1 个变量作为参数变量名只由 1 个小写字母组成例如 a、b、c 等都是可以作为参数的变量名但是 f 不可以。函数通过参数列表说明所需要的参数参数列表紧跟着函数名用方括号包裹列出如果有多于 1 个的参数中间使用逗号分开。参数列表后紧跟着一个等号等号右边是作为函数参数的变量构成的计算
- 完善后的文法:
𝑉𝑡 = {+, −,∗,/, , , (, ),[,], 𝑓, 𝑋} 其中 X 表示除了 f 之外的任意小写字母 𝑉𝑛 = {S, A, A', E, E', T, T', F} G[S]: S → f[A] = E A → XA' | ε A' → ,XA' | ε E → E'+T | E'-T | T E' → + | - T → T'*F | T'/F | F T' → * | / F → (E) | X
- SLR(1)分析表
状态 | + | - | * | / | ( | ) | [ | ] | f | X | $ | A | A' | E | E' | T | T' | F
----- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --
0 | | | | | s2 | | | | g4 | g5 | | | | s6 | | s7 | | s8
1 | r3 | r3 | | | | r3 | | r3 | | | r3 | | | | | | |
2 | s9 | s10| | | s2 | | | | | g5 | | | | | | | |
3 | s9 | s10| | | s2 | | | | | r1 | | | | | | | |
4 | | | | | | | s11| | | | | | | | | | |
5 | | | | | | | | | | | | | | | | | |
6 | s9 | s10| | | s2 | | | | | | | | | | | | |
7 | | | | | | | r5 | r5 | | | r5 | | | | | | |
8 | | | | | | | r4 | r4 | | | r4 | | | | | | |
9 | | | | | s2 | | | | | g12| | | | | | s7 | |
10 | | | | | s2 | | | | | r2 | | | | | | s7 | |
11 | | | | | | | | | | | | | | | | | acc
- 语法制导翻译过程:
S → f[A] = E { add(f, A.params, E.addr) } A → XA' { A'.params = [X.value] } A'→ ,XA' { A'.params = A'.params + [X.value] } E → E'+T { E.addr = newtemp(); add('+', E'.addr, T.addr, E.addr) } E → E'-T { E.addr = newtemp(); add('-', E'.addr, T.addr, E.addr) } E → T { E.addr = T.addr } E'→ + { E'.op = '+' } E'→ - { E'.op = '-' } T → T'F { T.addr = newtemp(); add('', T'.addr, F.addr, T.addr) } T → T'/F { T.addr = newtemp(); add('/', T'.addr, F.addr, T.addr) } T → F { T.addr = F.addr } T'→ * { T'.op = '*' } T'→ / { T'.op = '/' } F → (E) { F.addr = E.addr } F → X { F.addr = X.value }
-
测试例子:
-
f[a]=b+c-d/e add(f, ['a'], [b, c, d, e]) add('+', 'b', 'c', t1) add('/', 'd', 'e', t2) add('-', t1, t2, t3) f['a'] = t3
-
f[a,b]=c-de/f+g add(f, ['a', 'b'], [c, d, e, f, g]) add('', 'd', 'e', t1) add('/', t1, 'f', t2) add('-', 'c', t2, t3) add('+', t3, 'g', t4) f['a', 'b'] = t4
-
f[x]=y+(z*w Error: 缺失右括号
-
f[]=a+b Error: 参数列表不能为空
-
f[a,b,c]=(a+b)c/d-e add(f, ['a', 'b', 'c'], [a, b, c, d, e]) add('+', 'a', 'b', t1) add('', t1, 'c', t2) add('/', t2, 'd', t3) add('-', t3, 'e', t4) f['a', 'b', 'c'] = t
原文地址: https://www.cveoy.top/t/topic/fZ8L 著作权归作者所有。请勿转载和采集!