2014-10-16 3 views
4

У меня есть это правило lexer, определенное в моем файле ANTLR v3 grammar - это математический текст в двойных кавычках. Мне нужно преобразовать его в ANTLR v4. ANTLR компилятор выдает ошибку синтаксиса ошибки: несогласованный вход '@' ожидает COLON при совпадении с правилом lexer '(в строке @init). Может ли правило lexer содержать блок @init? Как это следует переписать?ANTLR4 правило lexer с блоком @init

DOUBLE_QUOTED_CHARACTERS 
@init 
{ 
    int doubleQuoteMark = input.mark(); 
    int semiColonPos = -1; 
} 
: ('"' WS* '"') => '"' WS* '"' { $channel = HIDDEN; } 
{ 
    RecognitionException re = new RecognitionException("Illegal empty quotes\"\"!", input); 
    reportError(re); 
} 
| '"' (options {greedy=false;}: ~('"'))+ 
    ('"'|';' { semiColonPos = input.index(); } ('\u0020'|'\t')* ('\n'|'\r')) 
{ 
    if (semiColonPos >= 0) 
    { 
     input.rewind(doubleQuoteMark); 

     RecognitionException re = new RecognitionException("Missing closing double quote!", input); 
     reportError(re); 
     input.consume();    
    } 
    else 
    { 
     setText(getText().substring(1, getText().length()-1)); 
    } 
} 
; 

Образец данных:

  1. "" -> кидает ошибку "Незаконные пустые кавычки!";
  2. "ASD -> кидает ошибку "Missing закрытия двойные кавычки"
  3. "текст!" -> возвращает текст (действительный ввод, содержание" ... ")
+0

Просмотрев ваше правило, мне не ясно, что вы намерены сопоставить с 'DOUBLE_QUOTED_CHARACTERS'. Не могли бы вы привести некоторые допустимые примеры ввода? –

+0

Я отредактировал мой вопрос и добавил несколько примеров. – Adrian

ответ

1

я в противостоял этой проблемой, когда моя грамматика .g4 импортировала файл lexer. Импорт файлов грамматики, похоже, вызывает множество недокументированных недостатков в ANTLR4. Поэтому в конечном итоге мне пришлось прекратить использовать импорт. В моем случае, как только я объединил грамматику LEXER в грамматику анализатора (один сингл. g4-файл) мои @input и @after ошибки синтаксического анализа исчезли.Я должен представить тестовый пример + ошибка, по крайней мере, чтобы получить это документально. Я буду обновлять здесь, когда я это сделаю. Я смутно вспоминаю 2-3 проблемы в отношении impo rting lexer в мой парсер, который вызвал недокументированное поведение. Многое здесь описано в stackoverflow.

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