语法转换为递归下降

时间:2015-04-09 20:33:43

标签: recursion

我正在尝试转换给定的语法,以便为递归下降做好准备。我最终的规则是:

SEQ --> constSEQ | operZ     
Z --> exprX | operX   
Y --> exprX | operX   
X --> expr | exproperX | ε  .

我应该对Z和Y做什么呢?

他们中的任何一个被淘汰了吗?

1 个答案:

答案 0 :(得分:0)

如果不了解所使用的软件系统(及其智能),有点难以说清楚。

如果在左侧,所有非终端必须是唯一的(没有或没有规则Y --> exprXY --> operX),那么唯一的目的就是元信息,也许是对于不同的语义解释生成的AST。

但是,是的,循环减少语法的可能性很小。另一方面,生成的函数Y可以调用Z。

(Mind exprX | operX可能与operX | exprX相同,具体取决于特定语法的符号或类似LL(1)的类型。)

A --> X BB -> X A也是多余的。

人们需要循环规则,直到不可能减少为止。

boolean checkRulesAreTheSame(Rule rule1, Rule rule2, Context context) {
    context.setNonTerminalsTheSame(true, rule1.nonTerminal, rule2.nonTerminal);
    if (productionsTheSame(rule1.production, rule2.production, context)) {
        return true;
    }
    context.setNonTerminalsTheSame(false, rule1.nonTerminal, rule2.nonTerminal);
    return false;
}

只有2个非终端的比较,找不到更罕见的案例A --> X BB -> X C以及C -> X A