【问题标题】:Remove left recursion from grammar从语法中删除左递归
【发布时间】:2016-03-03 00:06:37
【问题描述】:

从以下语法中删除左递归:

Q.1

S -> SXY | a
X -> xY | xX
Y -> Yy | epsilon

Q.2

P ->  P H 4 U | p
H -> h
U -> u | u P

我知道删除左递归的规则,但我很困惑。因此,如果有人请发布此语法的答案,那将很有帮助。


评论更新:

我知道这2个是左递归语法:

S -> SXY | a
P -> P H 4 U | p 

而且我知道如何从这些语法中删除左递归,但是其他语法呢?

P -> P ... This is left recursive. 
P -> p ... Is this is also left recursive ?

【问题讨论】:

  • “我很困惑”不是问题描述。要求别人给你答案是作弊。 SO 是一个获得帮助的地方:向我们展示您在转换中取得了多大的进步,描述您遇到的困难,我们会帮助您度过难关。
  • 我知道这2个是左递归语法:S -> SXY |一个 AND P -> P H 4 U | p 而且我知道如何从该语法中删除左递归,但是其他语法呢,它是否左递归? P -> P -> 这是左递归的。 P -> p -> 这也是左递归的吗?

标签: compiler-construction grammar left-recursion


【解决方案1】:

首先,让我们弄清楚术语:您评论中的四行(我添加到问题中)是语法规则,而不是语法。每个只处理一个扩展;它们都没有提供从起始符号 S 到终端符号字符串的路径。

左递归规则是 LHS 的扩展,一个非终结符号(大写字母),可以导致以相同符号开头的更长的字符串。因此,P -> P 不是左递归的,因为规则没有意义。 P -> p 不是左递归的,因为它将非终结符 P 扩展为 p(小写),一个终端符号。

你是正确的,前两个规则是左递归的。

这会让你感动吗?我相信它可以回答您所有未解决的具体问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多