Буквенное значение в одинарных кавычках не может быть лексером Antlr - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть правило лексера, которое определяет буквальную строку в одинарных кавычках как

L_S_STRING  : '\'' (('\'' '\'') | ('\\' '\'') | ~('\''))* '\''

. В одном конкретном случае это не удается:

'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\''

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

'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z'''

Я не уверен, что это как-то связано с наличием не жадного оператора, который вызвал первое совпадение ('\ '' '\' ')?Если это так, я не вижу, как могла бы работать последняя версия.

В любом случае, может кто-нибудь помочь, пожалуйста?

ОБНОВЛЕНИЕ - Я не могу воспроизвести ее за пределами полной версии.грамматика.Это может быть красная сельдь.

ОБНОВЛЕНИЕ - я пропустил какой-то важный контекст, поэтому я разместил здесь еще один вопрос Antlr4: правило одинарных кавычек не выполняется, когда есть escape-символы плюс возврат каретки, новая строка

1 Ответ

0 голосов
/ 22 ноября 2018

Я не могу воспроизвести это.Учитывая следующую грамматику:

lexer grammar Test;

L_S_STRING  : '\'' (('\'' '\'') | ('\\' '\'') | ~('\''))* '\'';
OTHER       : . ;

, которая может быть проверена следующим образом:

String source = "A'yyyy-MM-dd\\\\'T\\\\'HH:mm:ss\\\\'Z\\\\''B";

Test lexer = new Test(CharStreams.fromString(source));
CommonTokenStream tokens = new CommonTokenStream(lexer);
tokens.fill();

for (Token t : tokens.getTokens()) {
    System.out.printf("%-15s %s\n", Test.VOCABULARY.getSymbolicName(t.getType()), t.getText());
}

напечатает:

OTHER           A
L_S_STRING      'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\''
OTHER           B
EOF             <EOF>
...