Использование регулярного выражения C ++ 11 для захвата содержимого файла безконтекстной грамматики
Я пытаюсь написать собственную спецификацию по контекстно-свободной грамматике, чтобы связать ее с правилами моего лексера / парсера. Это должно быть похоже наANTLR»s, где идентификаторы в верхнем регистре классифицируются как правило Lexer, а идентификаторы в нижнем регистре классифицируются как правило Parser. Он предназначен для принятия любой комбинации строковых литералов и / или регулярных выражений для правил лексера и любой комбинации правил лексера / регулярного выражения и / или других идентификаторов синтаксического анализатора для правил синтаксического анализатора. Каждое правило в формате <идентификатор>: <выражение>;
Вот'Вот пример грамматики:
integer : DIGIT+; //parser rule containing at least one lexer rule
twodigits : DIGIT DIGIT; //parser rule containing two consecutive lexer rules
DIGIT : [0-9]; //lexer rule containing regex
string : '"' CHAR* '"'; //parser rule containing zero or more
// lexer rules, wrapped in two string literals
CHAR : (LCHAR|UCHAR); //lexer rule containing two lexer rules which
// will later evaluate to one of two tokens
LCHAR : [a-z]; //lexer rule containing regex
UCHAR : [A-Z]; //lexer rule containing regex
SPACE : ' '; //lexer rule containing string literal
Беда яm Имеет возможность сопоставлять строки выражения, так как их содержимое имеет тенденцию варьироваться.
Я изначально написал:([a-zA-Z0-9_]*)(?:\s*)(?:\:)(?:\s*)((?:\'?).*(?:\'?)(?:\;))
как правило соответствия, которое подходит для однострочного литерального выражения, заключенного в одинарные кавычки, но мне нужно расширить его, чтобы учесть несколько не жадных строковых литералов и объединенные операторы, разделенные любым количеством пробелов. Меня не интересует соответствие потенциальному регулярному выражениюs внутри сопоставленного выражения или даже захвата сегрегированных частей выражения, поскольку это обрабатывается позже отдельной операцией регулярного выражения, поэтому на самом деле мне просто нужноутверждать идентификаторы и выражения ...
В общемМне нужна операция regex_search для просмотра грамматикис использованием следующего синтаксиса совпадений:
Действительный идентификаторначиная с одной или нескольких строчных или заглавных букв, за которыми может следовать любое количество буквенно-цифровых символов (которые могут содержать любое количество символов подчеркивания между ними, если идентификатор не начинается или не заканчивается одним).Любое количество пробельные символы, символы табуляции, переносы строк и т. д. без их захвата.Двоеточие не захватывая это.Любое количество пробельные символы, символы табуляции, переносы строк и т. д. без их захвата.Хотя бы один из: (в любом порядке) любое количество строковых литералов (заключенных в одинарные кавычки, без ввода кавычек), любое количество идентификаторов лексера / синтаксического анализатора, любое количество регулярных выражений 's (заключено в квадратные скобки). Результат этого правила сопоставления должен захватывать все выражение в виде одной строки, которая впоследствии будет проходить этап постобработки.Любое количество пробельные символы, символы табуляции, переносы строк и т. д. без их захвата.Точка с запятой по желанию следует любой незафиксированный пробел.Опционально любой количество незаписанных пробелов с последующим комментарием в виде захваченной строкиЛюбое количество пробельные символы, символы табуляции, переносы строк и т. д. без их захвата.ВопросМожно ли поместить это в одну операцию regex_search?
мы бездельничалиExpresso и просто могукажется, правильно понял ...
Пока что яя смог придумать следующее:
#/////////////////////
# Identifier
#/////////////////////
(
(?:[a-zA-Z]+) # At least one lower/uppercase letter
(?:
(?:[a-zA-Z0-9_]*) # Zero or more alphanumeric/underscore characters,
(?:\w+) # explicitly followed by one or more alphanumeric
)? # characters
)
#/////////////////////
# Separator
#/////////////////////
(?:\s*) # Any amount of uncaptured whitespace
(?:\:) # An uncaptured colon
(?:\s*) # Any amount of uncaptured whitespace
#///////////////////////
# Expression
#///////////////////////
(
# String Literals:
(?:\'?) # An optional single quote,
(?: # which is meant to start and end a string
(?:[^'\\] | \\.)* # literal, but issues several problems for
) # me (see comments below, after this code block)
(?:\'?)
# Other expressions
# ????????????
)
#/////////////////////
# Line End
#/////////////////////
(?:\s*) # Any amount of uncaptured whitespace
(?:\;) # An uncaptured colon
(?:\s*) # Any amount of uncaptured whitespace
Как видите, у меня естьидентификаторы,сепараторы а такжелиния концы работает отлично. Но выражения там, где яЯ полностью застрял!
Как я могу сказать библиотеке регулярных выражений, что я хочуИЛИ не жадный строковый литерал,ИЛИ ЖЕ любой набор символов до конца строки,А ТАКЖЕ любое их количество в любом порядке?
Даже если бы я допустил только один строковый литерал, как бы я сказал "Закрывающая одинарная кавычка НЕ является обязательной, если первая существует "?