Перейти к содержанию
    

Обратная польская запись

Уважаемые коллеги!

 

Ковыряюсь тут по своим надобностям с обратной польской записью выражений. Задача - сделать интерпретатор формул в собственный байт-код для последующего автоматического исполнения. Интерпретация польской записи хороша по быстродействию, и при хранении дает минимум накладных расходов памяти. Вроде с преобразованием текстовой строки в байт-код по "польски" разобрался, все получается. А вот с обратным преобразованием что-то туплю - не могу понять, как по польской записи восстановить наличие скобок в выражении.

 

может кто знает алгоритм преобразования обратной польской записи в обычное выражение со скобками?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думается мне, что обратная польская запись не имеет однозначного выражения в скобочной форме. Поэтому стоит задуматься, зачем вам обратное преобразование. Храните в обычной форме, преобразовывайте при интерпретации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

храню и исполняю я в польской, но ведь пользователю надо иной раз показать, что именно там харнится и исполняется? и показать надо в том виде, как он вводил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Храните то, что пользователь ввёл. Другим способом восстановить из польской записи первоначальный ввод не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

должно получиться, я надеюсь...

хранить в том виде, как вводится формула, можно, но вот интерпретация будет тормозной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот, кстати, на хабре нашел алгоритм: http://habrahabr.ru/post/147104/

только вот для МК с небольшим объемом ОЗУ алгоритм с динамическим выделением памяти - это не фонтан... и работа со строками тоже не очень хороша...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только вот для МК с небольшим объемом ОЗУ алгоритм с динамическим выделением памяти - это не фонтан... и работа со строками тоже не очень хороша...
Работы со строками можно избежать, а вот память понадобится в любом случае :laughing:

Алгоритм простой - вместо вычисления значения (интерпретатором) на пуле памяти строится дерево, это выражение описывающее. После построения производится обычный рекурсивный обход дерева с выводом результата в виде формулы.

 

Кстати, дерево можно использовать вместо ОПЗ и при вычислении (в интерпретаторе), вместо отдельного стека будет использоваться С'ный процедурный стек, а в остальном они совпадают.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может кто знает алгоритм преобразования обратной польской записи в обычное выражение со скобками?

На Форте - в книге С.Н. Баранов, Н.Р. Ноздрунов — Язык Форт и его реализации

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...алгоритм преобразования обратной польской записи в обычное выражение со скобками?

 

без сохранения инфы о месторасположения скобок(относительно других частей выражения) - не прокатит. лишнии можно выкидывать,

при анализе - если приоритет не поменялся со скобками. как то так... да и направление добавления новых выражений при обратном

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

форт?! :blink: Си - наше все!

Форт - это другое всё! :) (c хорошими, но изданными давно книгами)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

форт?! :blink: Си - наше все!

А в чем проблема-то? Пишите ядро Форта на С, а потом достраиваете нужную функциональность уже на Форте, компактно и эффективно. Разве вы не этого хотели? Иначе зачем бы вам было огород городить с обратной польской записью?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я очень благодарен за советы сломать до основания все и построить новое лучшее... но я был бы еще более благодарен за ответы по существу моего вопроса, без критики моего подхода (оставьте мне мое желание стучаться в открытые двери).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но я был бы еще более благодарен за ответы по существу моего вопроса, без критики моего подхода
Я вам уже дал совет - сделать дерево, а не ОПЗ. Чем он вас не устраивает?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я вам уже дал совет - сделать дерево, а не ОПЗ. Чем он вас не устраивает

я делаю интерпретатор собственного байт-кода. ОПЗ позволяет получить строго линейный байт-код, т.е. извлекаю байт за байтом и исполняю, не нужно передвигать указатели, помнить предыдущие состояния и т.п., как для дерева. получение ОПЗ из нативной формулы достаточно простое, я его уже реализовал. чем лучше дерево для интерпретации - не понимаю. возможно, был бы смысл в нем для интерпретации не формул, а именно языка более высокого уровня, с ветвлениями, подпрограммами, циклами и т.п., но даже и в этом не уверен.

 

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

 

 

спасибо за внимание.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...