Правило JvmFormalParameter неоднозначно?

У меня есть простая небольшая грамматика, которая постоянно выдает ошибку множественных альтернатив, когда я пытаюсь создать артефакты Xtext. Грамматика такова:

grammar org.xtext.example.hyrule.HyRule with org.eclipse.xtext.xbase.Xbase

generate hyRule (You can only use links to eclipse.org sites while you have fewer than 25 messages )

Start:
    rules+=Rule+
    ;

Rule:
    'FOR''PAYLOAD'payload=PAYLOAD'ELEMENTS' elements+=JvmFormalParameter+'CONSTRAINED' 'BY' expressions+= XExpression*;

PAYLOAD:
    "Stacons"|"PFResults"|"any"
;

И точная ошибка, которую я получаю:

![warning(200): ../org.xtext.example.hyrule/src-gen/org/xtext/example/hyrule/parser/antlr/internal/InternalHyRule.g:3197:2: Decision can match input such as "{RULE_ID, '=>', '('}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
error(201): ../org.xtext.example.hyrule/src-gen/org/xtext/example/hyrule/parser/antlr/internal/InternalHyRule.g:3197:2: The following alternatives can never be matched: 2][1]

Я прикрепил диаграмму синтаксиса для сгенерированной грамматики antlr в antlrworks и ясно вижу несколько альтернатив (JvmFormalParameter может соответствовать RULE_ID через правило JvmTypeReference или ValidID).

Так что похоже, что JvmFormalParameter неоднозначен... Извиняюсь за мою глупость, но может ли кто-нибудь указать, что мне не хватает? Есть ли способ преодолеть эту двусмысленность при использовании правила JvmFormalParameter в моей грамматике?

введите здесь описание изображения


person Marcus Mathioudakis    schedule 30.08.2012    source источник


Ответы (1)


Правило JvmFormalParameter определяется как

JvmFormalParameter returns types::JvmFormalParameter:
    (parameterType=JvmTypeReference)? name=ValidID;

поэтому тип параметра является необязательным. Если вы используете elements+=JvmFormalParameter+, вы разрешаете несколько параметров без разделителя, поэтому синтаксический анализатор не может принять решение о входной последовательности.

String s

поскольку и String, и s могут быть именами двух параметров, или String s может быть одним параметром с типом String и именем s. Вы должны использовать разделитель, например

elements+=JvmFormalParameter (',' elements+=JvmFormalParameter)*

или используйте правило FullJvmFormalParameter, которое определено с обязательной ссылкой на тип:

FullJvmFormalParameter returns types::JvmFormalParameter:
    parameterType=JvmTypeReference name=ValidID;
person Sebastian Zarnekow    schedule 30.08.2012
comment
Использование разделителя! Сейчас это кажется таким очевидным, но, увы, я об этом не подумал :)...Большое спасибо. - person Marcus Mathioudakis; 31.08.2012