мне нужно поддерживать один строку в кавычках с уцелевшими символами и способностью использовать двойные фигурные скобки в виде последовательности «бегству ', который потребует дополнительного разбора. Поэтому оба этих примера должны быть поддержаны. Меня не так беспокоит второй пример, потому что это кажется тривиальным, если я могу заставить первого работать и не совпадать с двойными фигурными фигурными фигурами.
1. 'this is a string literal with an escaped\' character' 2. 'this is a string {{functionName(x)}} literal with double curlies'
StringLiteral
: '\'' (ESC | AnyExceptDblCurlies)*? '\'' ;
fragment
ESC : '\\' [btnr\'\\];
fragment
AnyExceptDblCurlies
: '{' ~'{'
| ~'{' .;
Я сделал много исследований по этому вопросу и понять, что вы не можете отрицать несколько персонажей, и даже видели подобный подход работы в ответе Барта на этом посту ...
Negating inside lexer- and parser rules
Но что я вижу, что в приведенном выше примере 1, сбежавший апостроф не распознается, и я получаю сообщение об ошибке синтаксического анализатора, что он не может соответствовать «характер».
если я изменить строку правило буквальным маркера к следующему работает ...
StringLiteral
: '\'' (ESC | .)*? '\'' ;
Любые идеи, как обрабатывать этот сценарий лучше? Я могу вывести, что экранированный символ получает соответствие AnyExceptDblCurlies вместо ESC, но я не уверен, как решить эту проблему.
действительно ли вам нужно токенизировать содержимое строкового литерала на данном этапе? вы не говорите, какой у вас вариант использования грамматики; я думаю о языках, таких как C или C#, которые обычно оставляют разбор литералов для функций времени выполнения, printf, String.Format и т. п. – dlatikay
@dlatikay, мне нужно проанализировать случай, когда в литере есть «{{x} } ', поэтому я не могу отложить до времени выполнения. Вы полагаете, что может быть проще справиться с этим случаем на уровне правила парсера? – ichrisnichols
Я вижу ... да, правила парсера> это напоминает мне [этот] (http://stackoverflow.com/questions/1850468/parsing-string-interpolation-in-antlr) – dlatikay