【问题标题】:Reading Right recursion读取右递归
【发布时间】:2018-05-16 20:43:45
【问题描述】:

我明白在左递归中

A -> Aα | β

所以 A 可以是 β 并且停止或继续并且具有 Aα 无限次,因为它在其自身中被解释。所以如果我要解析βαα:

      A 
     / \
    A   α 
   / \
  Α   α
 /
β 

我发现右递归中的相同语法如下:

A-> βA'

A'-> αA'|ε

我可以再次为 βαα 做解析树,但我无法像左递归那样读取产生式规则。谁能解释一下这个右递归语法中产生式规则的阅读步骤?

【问题讨论】:

    标签: parsing recursion


    【解决方案1】:

    生产规则按以下顺序应用:

    A -> 
      -> βA'   (apply A -> βA')
      -> βαA'  (apply A' -> αA')
      -> βααA' (apply A' -> αA')
      -> βαα   (apply A' -> ε)
    

    解析树如下所示:

      A 
     / \
    β   A' 
       / \
      α   A'
         / \
        α   A'
            |
            ε
    

    删除直接左递归

    每个具有直接左递归的规则:

    A -> Aa | Ab | Ac | ... | x | y | z
    

    替换为:

    A  -> xA' | yA' | zA' | ...
    A' -> aA' | bA' | cA' | ε
    

    其中abc、...、xyz 是不以A 开头的序列。

    重复这个过程,直到没有直接左递归。

    【讨论】:

    • 感谢您的回答,但我最感兴趣的是如何将左递归语法转换为右递归语法。我自己没有想出正确的递归语法。
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多