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

 
 
> Обратная польская запись, преобразование не туда, а обратно
ARV
сообщение May 28 2014, 02:42
Сообщение #1


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

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



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

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

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



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ARV
сообщение May 29 2014, 10:54
Сообщение #2


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

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



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


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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


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

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



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

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

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


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



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


Гуру
******

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



Цитата(ARV @ May 30 2014, 14:10) *
я делаю интерпретатор собственного байт-кода. ОПЗ позволяет получить строго линейный байт-код, т.е. извлекаю байт за байтом и исполняю, не нужно передвигать указатели, помнить предыдущие состояния и т.п., как для дерева. получение ОПЗ из нативной формулы достаточно простое, я его уже реализовал. чем лучше дерево для интерпретации - не понимаю.

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

Выглядит это приблизительно так (пример):
Исходная формула: (10+20)*30
ОПЗ: 10 20 + 30 *
Префиксная форма: * (+) 10 20 30 (Скобки вокруг операции показывают наличие скобок, используется только для вывода, кодируется старшим битом)

Процедура вычисления (кусочек):
Код
char* position;
int eval()
{
int arg1, arg2;
switch(*position++ & 0x7F)
  {
    case '+': arg1=eval(); arg2=eval(); return arg1+arg2;
    case '*': arg1=eval(); arg2=eval(); return arg1*arg2;
    case 'I': /* constant */ arg1=*(int*)position; position+=sizeof(int); return arg1;
...
  }
}


Процедура печати (тоже кусочек)
Код
char* position;
void print()
{
char cmd=*position++;
int arg1;

if (cmd&0x80) printf("(");
switch(cmd & 0x7F)
  {
    case '+': print(); printf("+"); print(); break;
    case '*': print(); printf("*"); print(); break;
    case 'I': /* constant */ arg1=*(int*)position; position+=sizeof(int); printf("%d",arg1); break;
...
  }
if (cmd&0x80) printf(")");
}


Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   Обратная польская запись   May 28 2014, 02:42
- - andrewlekar   Думается мне, что обратная польская запись не имее...   May 28 2014, 03:05
- - ARV   храню и исполняю я в польской, но ведь пользовател...   May 28 2014, 04:17
- - andrewlekar   Храните то, что пользователь ввёл. Другим способом...   May 28 2014, 04:36
- - ARV   должно получиться, я надеюсь... хранить в том виде...   May 28 2014, 05:21
- - ARV   вот, кстати, на хабре нашел алгоритм: http://habra...   May 28 2014, 06:27
|- - XVR   Цитата(ARV @ May 28 2014, 14:37) только в...   May 28 2014, 08:40
- - =AK=   Цитата(ARV @ May 28 2014, 16:22) может кт...   May 28 2014, 09:29
- - ARV   форт?! Си - наше все!   May 28 2014, 10:38
|- - Kopa   Цитата(ARV @ May 28 2014, 18:48) форт?...   May 28 2014, 16:24
|- - =AK=   Цитата(ARV @ May 29 2014, 00:18) форт?...   May 29 2014, 05:03
- - kolobok0   Цитата(ARV @ May 28 2014, 10:52) ...алгор...   May 28 2014, 15:57
- - ARV   хоть убейте, не понимаю, чем лучше префиксная запи...   May 30 2014, 09:01
|- - XVR   Цитата(ARV @ May 30 2014, 17:11) хоть убе...   May 30 2014, 10:09
- - _Ivana   Цитата(ARV @ May 28 2014, 12:27) храню и ...   May 31 2014, 17:45
- - редактор   А если хранить две записи - одну для пользователя,...   Jun 2 2014, 03:42


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

 


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


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