Удалить левый рекурсивный граф вызовов

В настоящее время я работаю над грамматикой 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;

Как я могу разрешить такие левые рекурсии?


person boindiil    schedule 13.01.2016    source источник


Ответы (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"));
person Christian Dietrich    schedule 13.01.2016