Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Построение дерева синтаксического анализа


Автор: Stampede 17.5.2005, 18:14
Вот столкнулся с задачкой: имеется строка, содержащая некое выражение в инфиксной нотации, примерно такого вида:

(A B C)

где A и C - некие операнды, каждый из которых, в свою очередь, может быть рекурсивно представлен формулой аналогичного вида, и так далее:

((a b ((c d e) f (g h i))) j (k l m))

Построить собственно дерево - не вопрос, но возникла идея приспособить для этого дела регулярное выражение - чтобы, так сказать, попользоваться плодами технического прогресса. В принципе грамматика тривиальная, но как составить регексп таким образом, чтобы он коррестно находил и возвращал самые внешние операнды? То есть в случае данного примера:

A = (a b ((c d e) f (g h i)))
B = j
C = (k l m)

Если такое возможно, то всех делов будет - организовать рекурсию. Но вот возможно ли, в этом я не очень уверен, тем более что с регекспами я тово, не сильно дружу.

Будут какие-нибудь идеи?

Автор: Void 17.5.2005, 19:40
Приспособить регулярные выражения для распознавания такой записи невозможно. Дело в том, что эта скобочная запись - контекстно свободная грамматика, а регэкспы распознают только праволинейные (автоматные) грамматики, которые являются подмножеством КС-грамматик.
Здесь проще всего написать рекурсивную функцию разбора или конечный автомат со стеком. Будут проблемы в реализации - пиши, поможем smile

Автор: Stampede 17.5.2005, 20:04
Цитата(Void @ 17.5.2005, 19:40)
Приспособить регулярные выражения для распознавания такой записи невозможно


Вот за что ценю экспертное знание - за способность мгновенно отсекать тупиковые варианты smile

Я, кстати, уже и сам спинным мозгом прочуствовал, что ерунда какая-то получается с регекспом: громоздко, некрасиво и ненадежно, даже если бы принципиально это оказалось возможно. Тем более что распарсить рекурсивно вручную всех делов оказалось где-то на (линенйых) полметра кода smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)