【问题标题】:LL(1) grammar and indexing operator [ ]LL(1) 语法和索引运算符 [ ]
【发布时间】:2013-08-15 23:20:39
【问题描述】:

我想学习如何解决将语法转移到 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

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

有人知道解决办法吗?

谢谢。

【问题讨论】:

  • 简单:使其成为后缀运算符,并应用 right 递归,C89 语法就是这样做的。
  • 为什么你认为它与你知道如何处理的案件不同?
  • 好吧,如果我喜欢另一个:F -> GC C -> [ E ]C C -> epsilon G -> id G -> int 我在想我不会得到相同的结果。但现在它看起来像是一个可行的解决方案。你怎么看?
  • @MilošLjumović:我想你差不多明白了,虽然我不知道int[E] 在你的语言中是否有效。我会选择F->G C; F->int; C->[ E ] C; C->epsilon; G->id; G->( E )

标签: compiler-construction grammar


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

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多