Forth
http://fforum.winglion.ru/

*преобразование скобочной записи в постфикс
http://fforum.winglion.ru/viewtopic.php?f=19&t=1509
Страница 10 из 10

Автор:  mOleg [ Пт июл 23, 2010 14:30 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

_Harry писал(а):
mOleg Опять какие то косяки с EVALUATE

там и в примере косяки 8) с макросами надо очень внимательным быть
должно быть так:
transl/ evaluate.fts

: ti1 s" 1 2 +" EVALUATE ; IMMEDIATE

: t2 ti1 3 + ;


однако, ошибки я ловил, когда при закрытии текушего потока есть незавершонное поределение, а так, как evaluate работает с отдельным потоком, оно и вылезло, править sources.f
\ транслировать указанный источник с помощью слова представленного своим xt
: EvalSrcWith ( src xt --> )
SWAP SetSource
ON-SOURCE-START
CATCH *IF ~ErrPlace THROW THEN DROP
source-id @ -2 <> state AND ABORT" Незавершенное определение в конце исходного текста!"
ExitSource ;


* EvalSrcWith повторная правка

Автор:  _Harry [ Пт июл 23, 2010 14:46 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

вопрос писал(а):
решение, учитывающее синтаксис языка весь

Это что транслятор с Си на Форт Бр........... спасибо не надо.
true-grue писал(а):
Очевидно, cinf от Михаила Максимова

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

Автор:  _Harry [ Пт июл 23, 2010 14:47 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

mOleg писал(а):
source-id @ -2 <>

Угу я уже и сам туда добрался :wink:

Автор:  _Harry [ Пт июл 23, 2010 14:59 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

mOleg писал(а):
должно быть так:
transl/ evaluate.fts
: ti1 s" 1 2 +" EVALUATE ; IMMEDIATE
: t2 ti1 3 + ;

ti1 положит на стек во время компиляции 3. И зачем мне это :?:

Код:
: ti1 s" 1 2 +" EVALUATE [COMPILE] LITERAL ; IMMEDIATE  \ что тут неправильно?
\ Это слово должно скомпилировать результат работы EVALUATE

Автор:  mOleg [ Пт июл 23, 2010 15:04 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

Цитата:
\ s" " S: ; \ пробелы просто пропускаются
\ Нет пробелы не считаются операторами

а зря, мне это нравится ;)

Автор:  mOleg [ Пт июл 23, 2010 15:08 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

_Harry писал(а):
ti1 положит на стек во время компиляции 3. И зачем мне это

не верно!
как раз ti1 исполняет EVALUATE в режиме компиляции, а это значит, что
в код скомпилируется:
lit(1) lit(2) +

_Harry писал(а):
: ti1 s" 1 2 +" EVALUATE [COMPILE] LITERAL ; IMMEDIATE  \ что тут неправильно?\ Это слово должно скомпилировать результат работы EVALUATE

то есть, в коде будет: lit(1) lit(2) + lit(??)

поэтому, литерал выдаст ошибку 8) исчерпание стека, если, конечно, на стеке у тя чего нить не болтается случайно завалявшегося.
Ж;)

Автор:  вопрос [ Пт июл 23, 2010 15:17 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

Цитата:
Это что транслятор с Си на Форт Бр........... спасибо не надо.

нет , только для строки с действиями

Автор:  _Harry [ Пт июл 23, 2010 15:41 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

вопрос писал(а):
нет , только для строки с действиями

Ну на вскидку
Код:
A++
Как компилировать
Или
Код:
A+=5


A - может быть байтом, словом, двойным, словом и т.д.
Типы учитывать надо, структуры, перечесления, - мало?
Ладно дальше юниты, адреса, элементы масива .... думаю достаточно.

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

Автор:  _Harry [ Пт июл 23, 2010 15:46 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

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

Как это :?: EVALUATE Выполнится во время компиляции и положит на стек 3 , LITERAL тоже выполнится скомпилирует число в слово и что не так?

Автор:  mOleg [ Пт июл 23, 2010 15:52 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

_Harry писал(а):
Как это EVALUATE Выполнится во время компиляции и положит на стек 3

EVALUATE не вычисляет выражение, а "вклинивает" трансляцию текста внутрь текущего потока.
Короче, это как просто вставить в код t2 вместо ti1 выражение: 1 2 +
то есть равносильно
: t2 1 2 + 3 - ;
соответственно в коде так и будет: lit(1) lit(2) + lit(3) - exit

Автор:  mOleg [ Пт июл 23, 2010 15:54 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

_Harry писал(а):
LITERAL тоже выполнится скомпилирует число в слово и что не так?

не так то, что LITERAL скомпилирует какое-то неизвестное число за 1, 2 и операцией сложения

если же тебе необходимо, чтобы EVALUATE вычислил значение строки, надо временно переключить state в режим трансляции, а потом, после трансляции строки, вернуть его обратно, тогда можно использовать и LITERAL, точнее, смотри слово literal в literals.f

Автор:  _Harry [ Пт июл 23, 2010 16:31 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

mOleg писал(а):
там и в примере косяки с макросами надо очень внимательным быть

Точно ступил :shuffle;
Самое интересное что чтобы обойти ошибку в EVALUATE я как раз
mOleg писал(а):
надо временно переключить state в режим трансляции, а потом, после трансляции строки, вернуть его обратно,
Это и делал таким образом свою ошибку и пропустил во как :!:

Автор:  _Harry [ Пт июл 23, 2010 16:37 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

mOleg писал(а):
Цитата:
\ s" " S: ; \ пробелы просто пропускаются
\ Нет пробелы не считаются операторами


а зря, мне это нравится

Собственно и мне сначало понравилось только это мешает правильно разбираться со знаками
Да и нелогично это, пробел все же не является оператором покрайней мере в Си подобных языках.

Страница 10 из 10 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/