Грамматика ANTLR - как добавить элементы, перезаписать обработку ошибок

Я вижу ответ Как заставить ANTLR 3.2 выйти при первой ошибке? что полезно.

Тем не менее, я не могу добавить эти правила '@', не испугавшись грамматики. Мой файл грамматики прост:

 grammar Exp;
 options {
 output=AST;

 }

 program 
  : includes decls (procedure)*  main  -> ^(SMALLCPROGRAM includes decls (procedure)*    main) //AST - PROGRAM root
  ;

   //Lexer and Parser rules continue below as normal..tested thoroughly and works

Но если я попытаюсь добавить любое из этих правил @, я получаю такие ошибки, как:

grammar file Exp.g has no rules

а также:

 Exp.g:0:1: syntax error: assign.types: org.antlr.runtime.EarlyExitException

 org\antlr\grammar\v3\DefineGrammarItemsWalker.g: node from line 202:4 required (...)+ loop did not match anything at input ';'

Кто-нибудь знает, в чем проблема? Я просто хочу изменить свою грамматику, чтобы, когда я запускаю ее из своего отдельного основного класса (передавая в него ввод с помощью ANTLRStringStream и т. Д.), Он фактически выдает ошибку в основном классе, когда возникает синтаксическая проблема, а не просто говорит что-то вроде:

line 1:57 missing RPAREN at '{'       

Прежде чем продолжить синтаксический разбор остальной части ввода нормально. В конечном итоге мой основной класс должен отказываться от синтаксического анализа любого синтаксически искаженного ввода, как определено моей грамматикой, и должен сообщать об ошибках пользователю.


person Awoken    schedule 13.02.2013    source источник


Ответы (1)


Вероятно, у вас неправильный порядок разделов / блоков. Убедитесь, что это выглядит так:

grammar Exp;

options {
  ...
}

tokens {
  ...
}

@parser::header {
  ...
}

@lexer::header {
  ...
}

@parser::members {

  ...
}

@lexer::members {
  ...
}

Я предполагаю, что вы поместили @member или @header раздел перед блоком tokens { ... }. tokens { ... } должен стоять сразу после options { ... }.

Я также могу вспомнить, что в некоторых версиях 3.x была проблема с пустыми разделами: убедитесь, что во всех разделах есть хотя бы что-то, в противном случае пропустите пустой раздел.

person Bart Kiers    schedule 13.02.2013
comment
Спасибо. Это сработало. Я добавил переопределения из другого вопроса, и теперь мой основной класс перехватывает исключение. Однако выброшенное исключение не очень информативно: MismatchedTokenException (18! = 49) Как я могу получить: строку 1:57, пропущенную RPAREN в сообщении '{'? Есть ли способ «извлечь» его из переопределений или другой способ переопределения? - person Awoken; 14.02.2013
comment
@ Проснувшись, здесь нет серебряной пули. Проверьте исключение, приведите его в соответствие и извлеките необходимую информацию из исключения. Однако давайте не будем использовать эти небольшие поля для комментариев для обширных вопросов и ответов. - person Bart Kiers; 14.02.2013