Compiler construction LL(1)语法和索引运算符[]

Compiler construction LL(1)语法和索引运算符[],compiler-construction,grammar,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 问题是如何处理索引运算符,同时还要避免左递归 有人知道解决办法吗 谢谢。(从评论中提升): 基于

我想学习如何解决将语法转移到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
问题是如何处理索引运算符,同时还要避免左递归

有人知道解决办法吗

谢谢。

(从评论中提升):

基于算术运算符的建议解决方案:

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]
,例如),尽管目标语言可能允许这样做(例如,
C
)在这种情况下,
F->int
应该替换为原来的
G->int

简单:将其设置为后缀运算符,并应用正确的递归,这就是C89语法的工作方式。为什么您认为它与您知道如何处理的情况不同?如果我喜欢另一个:
F->GC C->[E]C->epsilong->idg->int
我在想我不会得到同样的结果。但现在看来这是一个有效的解决方案。你觉得怎么样?@MilošLjumović:我想你差不多明白了,尽管我不知道
int[E]
在你的语言中是否有效。我会选择
F->gc;F->int;C->[E]C;C->epsilon;G->id;G->(E)