реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Обратная польская запись, преобразование не туда, а обратно
ARV
сообщение May 28 2014, 02:42
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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

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

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



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение May 28 2014, 03:05
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Думается мне, что обратная польская запись не имеет однозначного выражения в скобочной форме. Поэтому стоит задуматься, зачем вам обратное преобразование. Храните в обычной форме, преобразовывайте при интерпретации.
Go to the top of the page
 
+Quote Post
ARV
сообщение May 28 2014, 04:17
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение May 28 2014, 04:36
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Храните то, что пользователь ввёл. Другим способом восстановить из польской записи первоначальный ввод не получится.
Go to the top of the page
 
+Quote Post
ARV
сообщение May 28 2014, 05:21
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ARV
сообщение May 28 2014, 06:27
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
XVR
сообщение May 28 2014, 08:40
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ARV @ May 28 2014, 14:37) *
только вот для МК с небольшим объемом ОЗУ алгоритм с динамическим выделением памяти - это не фонтан... и работа со строками тоже не очень хороша...
Работы со строками можно избежать, а вот память понадобится в любом случае laughing.gif
Алгоритм простой - вместо вычисления значения (интерпретатором) на пуле памяти строится дерево, это выражение описывающее. После построения производится обычный рекурсивный обход дерева с выводом результата в виде формулы.

Кстати, дерево можно использовать вместо ОПЗ и при вычислении (в интерпретаторе), вместо отдельного стека будет использоваться С'ный процедурный стек, а в остальном они совпадают.
Go to the top of the page
 
+Quote Post
=AK=
сообщение May 28 2014, 09:29
Сообщение #8


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(ARV @ May 28 2014, 16:22) *
может кто знает алгоритм преобразования обратной польской записи в обычное выражение со скобками?

На Форте - в книге С.Н. Баранов, Н.Р. Ноздрунов — Язык Форт и его реализации
Go to the top of the page
 
+Quote Post
ARV
сообщение May 28 2014, 10:38
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение May 28 2014, 15:57
Сообщение #10


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ARV @ May 28 2014, 10:52) *
...алгоритм преобразования обратной польской записи в обычное выражение со скобками?


без сохранения инфы о месторасположения скобок(относительно других частей выражения) - не прокатит. лишнии можно выкидывать,
при анализе - если приоритет не поменялся со скобками. как то так... да и направление добавления новых выражений при обратном
преобразовании может быть как с лева так и с права - думаю придётся сохранять. просче оригинал сохранить, как тут уже прозвучало...
Go to the top of the page
 
+Quote Post
Kopa
сообщение May 28 2014, 16:24
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



Цитата(ARV @ May 28 2014, 18:48) *
форт?! blink.gif Си - наше все!

Форт - это другое всё! sm.gif (c хорошими, но изданными давно книгами)
Go to the top of the page
 
+Quote Post
=AK=
сообщение May 29 2014, 05:03
Сообщение #12


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(ARV @ May 29 2014, 00:18) *
форт?! blink.gif Си - наше все!

А в чем проблема-то? Пишите ядро Форта на С, а потом достраиваете нужную функциональность уже на Форте, компактно и эффективно. Разве вы не этого хотели? Иначе зачем бы вам было огород городить с обратной польской записью?
Go to the top of the page
 
+Quote Post
ARV
сообщение May 29 2014, 10:54
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
XVR
сообщение May 30 2014, 02:10
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ARV @ May 29 2014, 19:04) *
но я был бы еще более благодарен за ответы по существу моего вопроса, без критики моего подхода
Я вам уже дал совет - сделать дерево, а не ОПЗ. Чем он вас не устраивает?

Go to the top of the page
 
+Quote Post
ARV
сообщение May 30 2014, 06:00
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(XVR @ May 30 2014, 10:20) *
Я вам уже дал совет - сделать дерево, а не ОПЗ. Чем он вас не устраивает

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

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


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



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01568 секунд с 7
ELECTRONIX ©2004-2016