Давайте предположим, что у нас есть строка ONE|(TWO|(THREE|FOUR))
…
Зная, что std :: regex не поддерживать рекурсию, как мы можем разбить эту строку на std :: vector строк, который (по порядку) содержит:
THREE|FOUR
TWO|{0}
ONE|{1}
Цель преобразования этого в предыдущем способе состоит в том, чтобы создать пересекаемый список выражений, который должен семантически представлять вложенный оператор if / then. Как этого достичь?
Так как вы сначала хотите получить самый внутренний контент, вы можете использовать ленивое / неряшливое поведение RegEx и сопоставлять все до )
с (.*?)\)
или все, кроме круглых скобок с \([^\)\(]+
,
псевдокод:
while ( regex_match(string, regex) ) {
add matches to vector
replace matches in string with vector index in curly brackets
}
Пример RegEx: ((?:\(|^)[^\)\(]+(?:\)|$))
RegEx демо здесь: http://regex101.com/r/pJ4pO7
Использование библиотеки регулярных выражений для выполнения лексизма — ужасный способ сделать что-нибудь нетривиальное. Когда вы получите матч, вы не будете знать, какие совпал без постобработки. Если вы не хотите использовать сторонние библиотеки, вам нужно серьезно спросить себя, хотите ли вы написать свой собственный генератор лексеров для начинающих. Я рад дать вам советы, если вы хотите это сделать.
Как только у вас будет надежный лексинг, вы найдете следующую часть намного проще. Затем вы можете либо написать специальный анализатор, либо продолжить писать собственный генератор синтаксического анализатора.