我正在尝试转换给定的语法,以便为递归下降做好准备。我最终的规则是:
SEQ --> constSEQ | operZ
Z --> exprX | operX
Y --> exprX | operX
X --> expr | exproperX | ε .
我应该对Z和Y做什么呢?
他们中的任何一个被淘汰了吗?
答案 0 :(得分:0)
如果不了解所使用的软件系统(及其智能),有点难以说清楚。
如果在左侧,所有非终端必须是唯一的(没有或没有规则Y --> exprX
和Y --> operX
),那么唯一的目的就是元信息,也许是对于不同的语义解释生成的AST。
但是,是的,循环减少语法的可能性很小。另一方面,生成的函数Y可以调用Z。
(Mind exprX | operX
可能与operX | exprX
相同,具体取决于特定语法的符号或类似LL(1)
的类型。)
A --> X B
和B -> 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 B
和B -> X C
以及C -> X A
。