Грамматика Xtext: несоответствующий ввод '0', ожидающий RULE_INT

Я новичок в Xtext и пытаюсь создать простой DSL для железнодорожных систем, вот моя грамматика:

grammar org.xtext.railway.RailWay with org.eclipse.xtext.common.Terminals

generate railWay "http://www.xtext.org/railway/RailWay"

Model:
    (trains+=Train)*
    | (paths+=Path)*
    | (sections+=Section)*
;

Train:
    'Train' name=ID ':'
    'Path'  path=[Path]
    'Speed' speed=INT
    'end'
;

Path:
    'Path'      name=ID ':'
    'Sections'  ('{' sections+=[Section] (',' sections+=[Section] )+ '}' ) | sections+=[Section]
    'end'
;

Section:
    'Section'   name=ID ':'
    'Start'     start=INT
    'End'       end=INT
    ('SpeedMax' speedMax=INT)?
    'end'
;

Но когда я помещаю этот код в экземпляр Eclipse:

Section brestStBrieux :
    Start 0
    End 5
end

Section StBrieuxLeMan :
    Start 5
    End 10
end

Section leManParis :
    Start 1
    End 12
end

Path brestParis :
    Sections  { brestStBrieux, StBrieuxLeMan, leManParis}
end

Train tgv :
    Path  brestParis
    Speed  23
end

Я получил эту ошибку три раза:

несовпадающий ввод '0', ожидание RULE_INT несоответствие ввода '1', ожидание RULE_INT несоответствие ввода '5', ожидание RULE_INT

Я не вижу, откуда берутся эти ошибки, что я могу сделать, чтобы их исправить. Есть идеи?


person cartman    schedule 15.03.2015    source источник
comment
Вы уверены, что разместили все соответствующие части грамматики? уверены, что у вас нет ключевых слов или терминальных правил, пересекающихся с терминальным правилом INT?   -  person Christian Dietrich    schedule 15.03.2015
comment
У меня есть это терминальное правило, но я еще не использовал его: терминал FLOAT: '-'? INT ('.' INT)?;   -  person cartman    schedule 15.03.2015


Ответы (2)


Кристиан прав, так как терминал FLOAT больше не определен, первоначальная проблема решена. Во всяком случае, оставшаяся проблема - это правило

Path:
    'Path'      name=ID ':'
    'Sections'  ('{' sections+=[Section] (',' sections+=[Section] )+ '}' ) | sections+=[Section]
    'end'
;

который в настоящее время имеет этот приоритет:

Path:
    (
       'Path' name=ID ':' 'Sections'
       ('{' sections+=[Section] (',' sections+=[Section] )+ '}' )
    ) 
    |
    (sections+=[Section] 'end')
;

Вы можете переписать его на

Path:
    'Path'      name=ID ':'
    'Sections'  
    ( 
       ('{' sections+=[Section] (',' sections+=[Section] )+ '}' )
    |  sections+=[Section]
    ) 'end'
;
person Sebastian Zarnekow    schedule 16.03.2015

лексирование и синтаксический анализ - это разные шаги. таким образом, использование не имеет значения. и ваша грамматика становится неоднозначной (посмотрите на предупреждения при создании языка), вы должны превратить это в правило типа данных (просто опустите ключевое слово терминала)

=> измените свою грамматику на

grammar org.xtext.example.mydsl2.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl2/MyDsl"

Model:
    (trains+=Train)*
    | (paths+=Path)*
    | (sections+=Section)*
;

Train:
    'Train' name=ID ':'
    'Path'  path=[Path]
    'Speed' speed=INT
    'end'
;

Path:
    'Path'      name=ID ':'
    'Sections'  ('{' sections+=[Section] (',' sections+=[Section] )+ '}' ) | sections+=[Section]
    'end'
;

Section:
    'Section'   name=ID ':'
    'Start'     start=INT
    'End'       end=INT
    ('SpeedMax' speedMax=INT)?
    'end'
;

FLOAT : '-'? INT ('.' INT)?;
person Christian Dietrich    schedule 15.03.2015
comment
Не совсем понял ваш ответ, у меня есть эти два предупреждения при создании артефакта: предупреждение (200): ../org.xtext.railway/src-gen/org/xtext/railway/parser/antlr/internal/InternalRailWay. g:80:1: Решение может соответствовать входным данным, таким как EOF, с использованием нескольких альтернатив: 1, 2, 3. В результате альтернативы 2,3 были отключены для этого входного предупреждения (200): ../org.xtext. rail.ui/src-gen/org/xtext/railway/ui/contentassist/antlr/internal/InternalRailWay.g:176:1: решение может соответствовать входным данным, таким как EOF, с использованием нескольких альтернатив: 1, 2, 3. В результате альтернатива (ы) 2,3 были отключены для этого ввода - person cartman; 15.03.2015
comment
Это не сработало, у меня все те же ошибки. Я удалил терминальное правило FLOAT, но INT все еще не работает. - person cartman; 15.03.2015
comment
пожалуйста, поделитесь своей полной грамматикой. не забудьте регенерировать и перезапустить приложение времени выполнения - person Christian Dietrich; 15.03.2015