我想学习如何解决将语法转换为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
问题是如何处理索引操作符,同时我们必须避免左递归?
有人知道解决方案吗?
感谢。
答案 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
。