我目前正在研究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;
如何解决此类左递归问题?
答案 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"));