LL(1)语法和索引操作符[]

时间:2013-08-14 16:45:47

标签: compiler-construction grammar

我想学习如何解决将语法转换为LL(1)的问题。我有以下问题:

E -> E + E
E -> E * E
E -> E[ E ]
E -> int
E -> id

关于运营商'+'和'*'我知道解决方案:

E -> TA
A -> + TA
A -> epsilon

T -> FB
B -> * FB
B -> epsilon

问题是如何处理索引操作符,同时我们必须避免左递归?

有人知道解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:1)

(从评论中提升):

基于提出的算术运算符解决方案:

E -> T A
A -> + T A
A -> epsilon

T -> F B
B -> * F B
B -> epsilon

我们可以添加几乎类似的:

F -> G C
F -> int
C -> [ E ] C
C -> epsilon

结束时:

G -> id
G -> ( E )

最后一行中带括号的表达式不在原始问题中,但添加它似乎是合理的。 F节与其他两节的不同之处在于它拒绝整数文字的索引表达式(例如3[x]),尽管目标语言可能允许这种情况({{1}允许) },例如)在这种情况下,C应替换为原始F -> int