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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Обратная польская запись, преобразование не туда, а обратно
XVR
сообщение May 30 2014, 06:48
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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 30 2014, 09:01
Сообщение #17


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

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



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


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


Гуру
******

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



Цитата(ARV @ May 30 2014, 17:11) *
хоть убейте, не понимаю, чем лучше префиксная запись. если в байт-код писать признак скобок для будущей "печати", то совершенно без разницы, что пре-, что пост-
Отнюдь. пост- вообще плохо предназначенна для печати (что со скобками, что без). В процессе печати придется хранить формируемую строку как минимум для одного операнда (ее нельзя сразу вывести). В случае пре- никакие строки вообще хранить не надо - все выводится 'на лету'.

Посмотрите еще раз в мой код - там никаких буферов нет (ни динамических ни статических) sm.gif

Go to the top of the page
 
+Quote Post
_Ivana
сообщение May 31 2014, 17:45
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Цитата(ARV @ May 28 2014, 12:27) *
храню и исполняю я в польской, но ведь пользователю надо иной раз показать, что именно там харнится и исполняется? и показать надо в том виде, как он вводил.

Имхо, "как он вводил" - не надо. А перевести это в нормальную инфиксную запись и показать - можно. Посмотрите вот здесь, как альфа преобразует введенный бред в строке поле "инпут".
Go to the top of the page
 
+Quote Post
редактор
сообщение Jun 2 2014, 03:42
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post

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

 


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


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