ARV 1 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба Уважаемые коллеги! Ковыряюсь тут по своим надобностям с обратной польской записью выражений. Задача - сделать интерпретатор формул в собственный байт-код для последующего автоматического исполнения. Интерпретация польской записи хороша по быстродействию, и при хранении дает минимум накладных расходов памяти. Вроде с преобразованием текстовой строки в байт-код по "польски" разобрался, все получается. А вот с обратным преобразованием что-то туплю - не могу понять, как по польской записи восстановить наличие скобок в выражении. может кто знает алгоритм преобразования обратной польской записи в обычное выражение со скобками? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба Думается мне, что обратная польская запись не имеет однозначного выражения в скобочной форме. Поэтому стоит задуматься, зачем вам обратное преобразование. Храните в обычной форме, преобразовывайте при интерпретации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба храню и исполняю я в польской, но ведь пользователю надо иной раз показать, что именно там харнится и исполняется? и показать надо в том виде, как он вводил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба Храните то, что пользователь ввёл. Другим способом восстановить из польской записи первоначальный ввод не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба должно получиться, я надеюсь... хранить в том виде, как вводится формула, можно, но вот интерпретация будет тормозной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба вот, кстати, на хабре нашел алгоритм: http://habrahabr.ru/post/147104/ только вот для МК с небольшим объемом ОЗУ алгоритм с динамическим выделением памяти - это не фонтан... и работа со строками тоже не очень хороша... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба только вот для МК с небольшим объемом ОЗУ алгоритм с динамическим выделением памяти - это не фонтан... и работа со строками тоже не очень хороша...Работы со строками можно избежать, а вот память понадобится в любом случае :laughing: Алгоритм простой - вместо вычисления значения (интерпретатором) на пуле памяти строится дерево, это выражение описывающее. После построения производится обычный рекурсивный обход дерева с выводом результата в виде формулы. Кстати, дерево можно использовать вместо ОПЗ и при вычислении (в интерпретаторе), вместо отдельного стека будет использоваться С'ный процедурный стек, а в остальном они совпадают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 18 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба может кто знает алгоритм преобразования обратной польской записи в обычное выражение со скобками? На Форте - в книге С.Н. Баранов, Н.Р. Ноздрунов — Язык Форт и его реализации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба форт?! :blink: Си - наше все! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба ...алгоритм преобразования обратной польской записи в обычное выражение со скобками? без сохранения инфы о месторасположения скобок(относительно других частей выражения) - не прокатит. лишнии можно выкидывать, при анализе - если приоритет не поменялся со скобками. как то так... да и направление добавления новых выражений при обратном преобразовании может быть как с лева так и с права - думаю придётся сохранять. просче оригинал сохранить, как тут уже прозвучало... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kopa 0 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба форт?! :blink: Си - наше все! Форт - это другое всё! :) (c хорошими, но изданными давно книгами) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=AK= 18 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба форт?! :blink: Си - наше все! А в чем проблема-то? Пишите ядро Форта на С, а потом достраиваете нужную функциональность уже на Форте, компактно и эффективно. Разве вы не этого хотели? Иначе зачем бы вам было огород городить с обратной польской записью? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба я очень благодарен за советы сломать до основания все и построить новое лучшее... но я был бы еще более благодарен за ответы по существу моего вопроса, без критики моего подхода (оставьте мне мое желание стучаться в открытые двери). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба но я был бы еще более благодарен за ответы по существу моего вопроса, без критики моего подходаЯ вам уже дал совет - сделать дерево, а не ОПЗ. Чем он вас не устраивает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Я вам уже дал совет - сделать дерево, а не ОПЗ. Чем он вас не устраивает я делаю интерпретатор собственного байт-кода. ОПЗ позволяет получить строго линейный байт-код, т.е. извлекаю байт за байтом и исполняю, не нужно передвигать указатели, помнить предыдущие состояния и т.п., как для дерева. получение ОПЗ из нативной формулы достаточно простое, я его уже реализовал. чем лучше дерево для интерпретации - не понимаю. возможно, был бы смысл в нем для интерпретации не формул, а именно языка более высокого уровня, с ветвлениями, подпрограммами, циклами и т.п., но даже и в этом не уверен. остается небольшое дело: показать байт-код в виде понятного человеку выражения. на сегодня эта проблема уже решена мною примерно на 90%, на Си, без динамического распределения памяти (на статическом массиве байтов). пока что немного вызывает проблему унарные и тренарные операторы - в упомянутый ранее алгоритм эти операторы вписываются плоховато... спасибо за внимание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться