Я работаю с ANTLR4 и в процессе написания грамматики обрабатывает одиночные и двойные кавычки. Я пытаюсь использовать режимы Lexer для охвата строк, но это не работает для меня, моя грамматика указана ниже. Правильно ли это, или как я могу правильно разобрать их как токены вместо правил парсера с контекстом. Любое понимание?Обработка области для строк с одиночной и двойной кавычками в ANTLR4
Пример:
'single quote that contain "a double quote 'that has another single quote'"'
Лексер Грамматика
lexer grammar StringLexer;
fragment SQUOTE: '\'';
fragment QUOTE: '"';
SQSTR_START: SQUOTE -> pushMode(SQSTR_MODE);
DQSTR_START: QUOTE -> pushMode(DQSTR_MODE);
CONTENTS: ~["\']+;
mode SQSTR_MODE;
SQSTR_END: (CONTENTS | DQSTR_START)+ SQUOTE -> popMode;
mode DQSTR_MODE;
DQSTR_END:(CONTENTS | SQSTR_START)+ QUOTE -> popMode;
Parser
parser grammar StringParser;
options { tokenVocab=StringLexer; }
start:
dqstr | sqstr
;
dqstr:
DQSTR_START DQSTR_END
;
sqstr:
SQSTR_START SQSTR_END
;
ADDENDUM Благодаря @Lucas Trzesniewski для ответа.
Это часть грамматики, которую я пишу для разбора shell-подобного языка, я мог бы иметь несколько строк сценария, где они имели бы SQSTR
и DQSTR
. С помощью правил lexer, предоставленных в ответе, он объединяет несколько строк сценария.
Счастливый пример случай (что получить корректно распознаны с помощью ответа):
cmd 'single quote string'
cmd2 "double quote"
cmd3 'another single quote'
Это получить признание в виде трех команд и трех строк (одиночных и двойных)
Неанализируемые например: С другой стороны - обратите внимание, цитата в одинарной кавычки строк:
cmd 'single "quote string'
cmd2 "double quote"
cmd3 'another "single quote'
в этом случае было бы неправильно обнаружить все из них в качестве одной строки знак типа SQSTR.
Любые идеи, как решить эту проблему?
Мой ответ по-прежнему действителен, даже после вашего редактирования. Попробуйте. Вложенные двойные кавычки в строке с одной кавычкой и одиночная кавычка в строке с двойными кавычками совпадают, как и любой другой символ в этой строке. Здесь ничего особенного. –
@MikeLischke Привет, Майк, да, он будет обрабатывать этот случай, но есть и другие сценарии для сдерживания '' double, содержащие «single contains» double, который содержит «single», «», который потерпел бы неудачу с этой грамматикой. –