2017-01-03 8 views
0

Я простой грамматики, как этотКак Java Antlr4 не жадничать с STRING_LITERAL, содержащим "?

"STRING_LITERAL"(, "STRING_LITERAL")? 

В lexer.g4 я определяю STRING_LITERAL как этот

STRING_LITERAL: '"'[a-zA-Z0-9!#$&.+-^_{}:\\\" ]+'"'; 

Однако, это кажется, что он будет игнорировать запятую («,») между двумя словами, например, с этим входным тестом: «abc», «\» cde \ »« Anltr4 будет читать оба этих STRING_LITERALs как 1 текст вместо 2 текстов

List<TerminalNode> params = ctx.STRING_LITERAL(); // Only have 1 String element ("abc", "\"cde\"") 

Как я могу использовать antr4 с \ "в STRING_LIERAL и разбивать его на запятую (,), тогда параметры будут содержать 2 элемента (" abc "и" \ "cde \" ")?

ответ

1

Я использую '"' ('\\"'|.)*? '"' как мое правило STRING лексического анализатора, а затем использовать это в определении Params:

actionExpressions 
    : exp += expression (COMMA exp += expression)* 
    ; 

expression может быть что угодно, как целое, булево, строки, идентификаторы и так далее. Вы не должны пытаться интегрировать расщепление в пределах определения литерала STRING. Строка - это всего лишь последовательность символов.

В моем правиле lexer есть? «обрабатывает» несердечность.