删除左递归调用图



我目前正在研究Xtext语法,并在左递归图方面遇到了一些问题。我已经在我的语法中消除了所有直接左递归,但现在我有一些间接左递归,它们显示在 IDE 中,并带有消息This rule call is part of a left recursive call graph.

这是我的问题的一个例子:

grammar com.stackoverflow.Example with org.eclipse.xtext.common.Terminals
generate example "http://stackoverflow.com/Example"
Type:
    var157=ValueType | var158=ReferenceType;
ValueType:
    var160=StructType | var161=EnumType;
StructType:
    var162=TypeName | var163=SimpleType | var164=NullableType;
TypeName:
    var165=ID;
SimpleType:
    var166=NumericType | "bool";
NumericType:
    "decimal";
NullableType:
    var169=NonNullableValueType "?";
NonNullableValueType:
    var170=Type;
EnumType:
    var171=TypeName;
ReferenceType:
    var172=ClassType | var173=InterfaceType | var174=ArrayType;
ClassType:
    var176=TypeName | "object" | "dynamic" | "string";
InterfaceType:
    var177=TypeName;
ArrayType:
    var178=NonArrayType "[]";
NonArrayType:
    var180=Type;

如何解决此类左递归?

这种语法并没有真正被左分解。 而且是高度模棱两可的。在这里运行它是一个起点(忽略歧义并省略一些东西)

Type:
    ReferenceType;
TypeName returns Type:
    var165=ID;
ReferenceType returns Type:
     ClassType (({NullableType.type=current} "?") | ({ArrayType.componentType=current} "[]"))*;
ClassType returns Type:
    TypeName | ({ClassType} type=("object" | "dynamic" | "string"));

最新更新