Как решить проблему с несовпадением ANTLR - PullRequest
2 голосов
/ 22 декабря 2010

с учетом грамматики

test    : 'test' ID '\n' 'begin' '\n'  'end' '\n' -> ^(TEST ID);

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

и тестовая строка

"test blah\n begin\n end\n"

в результате

line 1:0 mismatched input 'test blah\\n begin\\n end\\n' expecting 'test'
<mismatched token: [@0,0:21='test blah\\n begin\\n end\\n',<12>,1:0], resync=test blah
 begin
 end
>

что здесь не так?

1 Ответ

6 голосов
/ 22 декабря 2010

Когда вы используете '\n' в своих правилах грамматики, вы не соответствует backslash+n, но символ новой строки.И похоже, что ваш ввод не содержит символов новой строки, но backslash+n.

Итак, я думаю, вам нужно либо изменить ваше правило test на:

test    
  : 'test' ID '\\n' 'begin' '\\n'  'end' '\\n'
  ;

в результате получается дерево разбора:

alt text

или оставьте ваше test правило как есть , но измените свой ввод на:

test blah
begin
end

В результате получается дерево разбора:

alt text

Если это не так, не могли бы вы опубликовать SSCCE: небольшую, полную рабочую демонстрацию, которую я (или кто-то ещеможно запустить) что показывает эту ошибку?

...