У меня есть это правило 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));
}
}
;
Образец данных:
- "" -> кидает ошибку "Незаконные пустые кавычки!";
- "ASD -> кидает ошибку "Missing закрытия двойные кавычки"
- "текст!" -> возвращает текст (действительный ввод, содержание" ... ")
Просмотрев ваше правило, мне не ясно, что вы намерены сопоставить с 'DOUBLE_QUOTED_CHARACTERS'. Не могли бы вы привести некоторые допустимые примеры ввода? –
Я отредактировал мой вопрос и добавил несколько примеров. – Adrian