2015-03-15 2 views
1

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

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

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

+0

Вы уверены, что вы вывесили все соответствующие части грамматика? уверен, что у вас нет каких-либо ключевых слов или правил терминалов, которые перекрываются с правилом терминала INT? –

+0

У меня есть это правило терминала, но я еще не использовал его: terminal FLOAT: '-'? INT ('.' INT) ?; – mouuu

ответ

0

Christian правильно, поскольку терминал 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' 
; 
0

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

=> изменить грамматику

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)?; 
+0

Не понял ваш ответ хорошо, у меня есть два предупреждения при создании артефакта: предупреждение (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.railway.ui/src-gen/org/xtext/railway/ui/contentassist/antlr/internal/InternalRailWay.g:176:1: Решение может сопоставлять ввод, такой как «EOF», с использованием нескольких альтернатив: 1, 2, 3 В результате альтернативы (-ы) 2,3 были отключены для этого ввода – mouuu

+0

я отредактировал ответ –

+0

Это не сработало, у меня все же есть те же ошибки. Я удалил правило терминала FLOAT, но все же INT, похоже, не работает – mouuu

Смежные вопросы