Избегайте предупреждений о множественных альтернативах Xtext

в моем xtext dsl я определил следующие правила:

Port returns tdg::Port:
    'port'
    'kind' kind=Kind
    'type' type=Type;

enum Kind returns tdg::PortKind:
    In='in' | Out='out';

enum Type returns tdg::PortType:
    Numeric | String | Boolean | Tuple;

Классы tdg исходят из базовой модели. Я получаю следующие предупреждения, когда компилирую грамматику dsl. Как я могу избежать их?

предупреждение (200): ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1: решение может соответствовать входным данным, таким как «порт» 'kind' 'in' 'type' 'String'" с использованием нескольких альтернатив: 1, 2 В результате альтернативы 2 были отключены для этого предупреждения ввода (200): ../com.isax.testdatagen.dsl/ src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1: Решение может сопоставлять входные данные, такие как «порт», «вид», «в», «тип», «логическое значение» с использованием нескольких альтернатив. : 1, 2 В результате альтернативы 2 были отключены для этого предупреждения ввода (200): ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/ InternalTdgDSL.g:250:1: решение может сопоставлять входные данные, такие как «порт», «вид», «в», «тип», «кортеж» с использованием нескольких альтернатив: 1, 2. В результате альтернатива (альтернативы) 2 была отключена для это входное предупреждение (200): ../com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g:250:1: решение может быть принято tch, например "'port' 'kind' 'in' 'type' 'Numeric'" с использованием нескольких вариантов: 1, 2 В результате альтернативы 2 были отключены для этого ввода warning(200): ../ com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g:854:30: решение может соответствовать входным данным, таким как «порт», «вид» in' 'type' 'Numeric'", используя несколько альтернатив: 1, 2 В результате альтернатива (ы) 2 была отключена для этого предупреждения ввода (200): ../com.isax.testdatagen.dsl.ui/src- gen/com/isax/testdatagen/ui/contentassist/antlr/internal/InternalTdgDSL.g:854:30: Решение может сопоставлять входные данные, такие как «порт», «вид», «в», «тип», «строка», используя несколько альтернатив. : 1, 2 В результате альтернатива(ы) 2 была отключена для этого предупреждения ввода(200): ../com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/ antlr/internal/InternalTdgDSL.g:854:30: Решение может сопоставлять входные данные, такие как «порт», «вид», «в», «тип», «логическое значение» с использованием нескольких альтернатив: 1, 2 В результате альтернатива (ы) 2 была отключена для этого предупреждения ввода (200): ../com.isax.testdatagen.dsl.ui/src-gen/com/isax/testdatagen/ui/contentassist/antlr/internal/ InternalTdgDSL.g:854:30: решение может сопоставлять входные данные, такие как «порт», «вид», «в», «тип», «кортеж» с использованием нескольких альтернатив: 1, 2. В результате альтернатива (альтернативы) 2 была отключена для этот ввод


person gartenkralle    schedule 20.05.2015    source источник
comment
не могли бы вы поделиться полной воспроизводимой грамматикой   -  person Christian Dietrich    schedule 20.05.2015
comment
У вас будет полная грамматика, если вы добавите следующее начальное правило: Модель: ports+=Port*;   -  person gartenkralle    schedule 21.05.2015
comment
это делает грамматику все еще не двусмысленной. в вашей грамматике должно быть что-то еще, что вызывает проблему. без возможности воспроизвести я не могу помочь   -  person Christian Dietrich    schedule 21.05.2015
comment
Больше ничего нет. Я считаю важным, чтобы tdg::Port, tdg::PortKind, tdg::PortType, In|Out и Numeric|String|Boolean|Tuple исходили из модели ecore.   -  person gartenkralle    schedule 22.05.2015
comment
Можете ли вы также поделиться соответствующими частями экокора?   -  person Christian Dietrich    schedule 22.05.2015


Ответы (1)


Такое предупреждение о «множественных альтернативах» может быть вызвано правилом, достижимым с использованием двух «путей» альтернатив, например.

Model:
    Rule1a | Rule1b;

Rule1a:
    Rule2 | Rule1b;

Rule1b:
    {Rule1b} 'rule1b';

Rule2: 
    {Rule2} 'rule2';

Здесь rule1b доступен из правила «Модель» двумя путями: напрямую из «Модели» и косвенно через «Правило1а».

Как заявил Кристиан, ваше сообщение об ошибке не может быть вызвано перечисленными вами правилами. Если ваша грамматика содержит только Model: ports+=Port*; кроме этих, возможно, вы создаете другую грамматику, чем вы думаете?

В любом случае, чтобы найти причину проблемы, вы должны идентифицировать правило, которое имеет неоднозначные экземпляры: Откройте com.isax.testdatagen.dsl/src-gen/com/isax/testdatagen/parser/antlr/internal/InternalTdgDSL.g строку 250 (как напечатано в журнале) и узнайте, какому правилу оно принадлежит. В моем примере ошибка заключается в правиле Antlr ruleModel, которое соответствует правилу Xtext Model.

person Bernhard Stadler    schedule 10.10.2016