删除左递归调用图

时间:2016-01-13 19:04:58

标签: grammar xtext left-recursion

我目前正在研究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;

如何解决此类左递归问题?

1 个答案:

答案 0 :(得分:1)

这个语法并没有真正考虑在内。这是非常暧昧的。 让这个在这里运行是一个起点(忽略歧义并省略一些东西)

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"));