Jump to content

помогите составить регулярное выражение


Recommended Posts

задача следующая: пишу программу обучающую азам программирования и алгоритмизации

она обрабатывает некий язык программирования

надо чтобы данный язык поддерживал такие конструкции, как цикл и условное ветвление

собственно при обработке я выдераю блоки кода регулярными выражениями

проблема в том, что нужна возможность обрабатывать вложеные конструкции

чтобы было понятнее покажу на примере

есть код:

код

ЕСЛИ условие ТО

код

ЕСЛИ
условие
ТО

код

ИНАЧЕ

код

КОНЕЦ ЕСЛИ

код

КОНЕЦ ЕСЛИ

код

ЕСЛИ условие ТО

код

КОНЕЦ ЕСЛИ

код

если мы выдергиваем код "жадной" регуляркой:

/ЕСЛИ\s(.*?)\sТО\s(.*?)\sКОНЕЦ\sЕСЛИ/i

то выдергивается следующее:

код

ЕСЛИ условие ТО

код

ЕСЛИ
условие
ТО

код

ИНАЧЕ

код

КОНЕЦ ЕСЛИ

код

КОНЕЦ ЕСЛИ

код

ЕСЛИ условие ТО

код

КОНЕЦ ЕСЛИ

код

а если выдергиваем обычной регуляркой

/ЕСЛИ\s(.*?)\sТО\s(.*)\sКОНЕЦ\sЕСЛИ/i

то выдергивается так:

код

ЕСЛИ условие ТО

код

ЕСЛИ
условие
ТО

код

ИНАЧЕ

код

КОНЕЦ ЕСЛИ

код

КОНЕЦ ЕСЛИ

код

ЕСЛИ условие ТО

код

КОНЕЦ ЕСЛИ

код

а мне надо чтобы выдергивалось так:

код

ЕСЛИ условие ТО

код

ЕСЛИ
условие
ТО

код

ИНАЧЕ

код

КОНЕЦ ЕСЛИ

код

КОНЕЦ ЕСЛИ

код

ЕСЛИ условие ТО

код

КОНЕЦ ЕСЛИ

код

собственно не соображу как составить регулярку

Link to comment
Share on other sites

Сложная задача

Вообшем то надо читать о рекурсивних preg-ов

http://bg2.php.net/manual/en/regexp.reference.php

Да и для парсера не знаю если preg самое удачное. Разсмотрите если хотите в miphpf.com (скачайте miphpf framework) как сделань miTemplateParser, там есть вложение тегов <mi:section>

Удачи :(

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...