![]() |
|
![]() ![]() ![]() |
|
Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: нет Всего: 144 |
Вот столкнулся с задачкой: имеется строка, содержащая некое выражение в инфиксной нотации, примерно такого вида:
(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 |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 3 Всего: 173 |
Приспособить регулярные выражения для распознавания такой записи невозможно. Дело в том, что эта скобочная запись - контекстно свободная грамматика, а регэкспы распознают только праволинейные (автоматные) грамматики, которые являются подмножеством КС-грамматик.
Здесь проще всего написать рекурсивную функцию разбора или конечный автомат со стеком. Будут проблемы в реализации - пиши, поможем ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: нет Всего: 144 |
Вот за что ценю экспертное знание - за способность мгновенно отсекать тупиковые варианты ![]() Я, кстати, уже и сам спинным мозгом прочуствовал, что ерунда какая-то получается с регекспом: громоздко, некрасиво и ненадежно, даже если бы принципиально это оказалось возможно. Тем более что распарсить рекурсивно вручную всех делов оказалось где-то на (линенйых) полметра кода ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |