Forth
http://fforum.winglion.ru/

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

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

_Harry писал(а):
А подскажи что с буфером получалось почему строка из него не EVALUAT-илась

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

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

Рановато я обрадовался.
Еще какой то странный глюк обнаружился.
Хотел сделать чтобы часть операторов просто вызывала ошибку.
Ну например так:
Код:
\ ---------Это в конце списка операторов ---------------
: ,  ERROR" Ошибка!!!"
; Теперь в консоли набираем
Код:
s" 1 ,  2"  >postfix TYPE
получаем дергающуюся надпись :hey;
что то про "неправильный дескриптор" . Т.е. она циклически выводится видимо и система висит.
Если эта же строка в файле то ошибка обрабатывается.

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

_Harry писал(а):
получаем дергающуюся надпись

очень интересно! занимаюсь

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

mOleg писал(а):
очень интересно! занимаюсь

А вот это тоже интересно
Код:
s" -1" >postfix TYPE
1 -  ok (0)
s" 2 + -1" >postfix TYPE
2     + 1 -  ok (0)

Так то вот >postfix понимает отрицательные числа
Чего то надо с этим делать :hey;

Автор:  mOleg [ Вт июл 13, 2010 18:21 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

_Harry писал(а):
А вот это тоже интересно Код:s" -1" >postfix TYPE1 -  ok (0)s" 2 + -1" >postfix TYPE2     + 1 -  ok (0)Так то вот >postfix понимает отрицательные числа

гм, ну, тут достаточно понятно. На сколько помню, запись типа a+-б не встречается, а встречается a+(-б).
За разбор лексем отвечает:
: GetOp ( --> operand 0 | addr true ) separators xWord DUP IFNOT DDROP GetSep THEN ?operator ;
кстати, для того, чтобы отловить подобную ситуацию, необходимо анализировать предыдущий символ, либо использовать другой символ, например: a+!b ;)

Автор:  mOleg [ Вт июл 13, 2010 20:50 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

_Harry писал(а):
получаем дергающуюся надпись

проблема локализована и исправлена, берем последнюю сборочку;

Автор:  _Harry [ Вт июл 13, 2010 22:30 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

mOleg писал(а):
На сколько помню, запись типа a+-б не встречается, а встречается a+(-б).

Хм а как вам это покажется: :wink:
#define NegConst -1500
вполне себе возможная ситуация.
Другой так же вполне возможный вариант:
#define ЧегоТоТам что_Ни_будь * -40
Скобки совсем не обязательны если отрицательное число отделено пробелом.
mOleg писал(а):
либо использовать другой символ, например: a+!b

Это чисто теоретический вариант меня же интересует трансляция готовых файлов с определенным синтаксисом.

А по сему
mOleg писал(а):
необходимо анализировать предыдущий символ

Это в точку! Но я пока не придумал как.

Автор:  вопрос [ Вт июл 13, 2010 22:48 ]
Заголовок сообщения:  Re: *преобразование скобочной записи в постфикс

Цитата:
Это в точку! Но я пока не придумал как.

Достаточно преобразовать файл, поделав пробелы перед минусами в случае сдвоенных операторов

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

вопрос писал(а):
Достаточно преобразовать файл, поделав пробелы перед минусами в случае сдвоенных операторов

Если бы все было так просто :roll:
Пока что >postfix этого не понимает см. скриншоты выше

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

_Harry писал(а):
mOleg писал(а):необходимо анализировать предыдущий символЭто в точку! Но я пока не придумал как.

ну, тут достаточно все просто:

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

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

_Harry писал(а):
Хм а как вам это покажется: #define NegConst -1500 вполне себе возможная ситуация.

кстати, если подумать, то не так уж и серьезно оно, точнее, оно все интересно:

s" -1500" >postfix TYPE
выдаст 1500 - , что вобщем-то верно!
то есть, если это самое 1500 - попадет в код, то результат будет в ряде случаев верен ;)

вобщем, по большому счету надо писать 2*(-3) и смотреть есть ли после скобки знак числа и само число!

кстати, если: 3*(-a) , то уже не знак числа, а операция над 'a' будет, т.е. приходим таки к: '0 a -' или '!a'.

Такие вот мысли

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

mOleg писал(а):
_Harry писал(а):
Хм а как вам это покажется: #define NegConst -1500 вполне себе возможная ситуация.

кстати, если подумать, то не так уж и серьезно оно, точнее, оно все интересно:

s" -1500" >postfix TYPE
выдаст 1500 - , что вобщем-то верно!
то есть, если это самое 1500 - попадет в код, то результат будет в ряде случаев верен ;)

вобщем, по большому счету надо писать 2*(-3) и смотреть есть ли после скобки знак числа и само число!

кстати, если: 3*(-a) , то уже не знак числа, а операция над 'a' будет, т.е. приходим таки к: '0 a -' или '!a'.

Такие вот мысли

Вобще - это ровно одно ветвление - если операторы подряд, то пытаемся распознать число как отрицательное, если не распознаётся - ошибка
ИМХО

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

вопрос писал(а):
то есть, если это самое 1500 - попадет в код, то результат будет в ряде случаев верен

И самое "хорошее" что в большинстве случаев неверен.
вопрос писал(а):
Вобще - это ровно одно ветвление - если операторы подряд, то пытаемся распознать число как отрицательное, если не распознаётся - ошибка

Все было бы хорошо, если бы небыло так плохо.
Вобщем вывод такой >postfix это только набросок, практически в готовом виде использовать нельзя.
Потому как еще один недостаток виден операторы считаются разделителями а они в xWord.fts могут быть только
односимвольными :!:
В реальных синтаксисах есть и многосимвольные операторы например:
>> << => <=
Т. е. начинать надо с этого, а ситуацию обработки знака числа отлавливать отдельно. Мне видится несколько способов,
так что это не проблема.

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

Цитата:
Все было бы хорошо, если бы небыло так плохо.
Вобщем вывод такой >postfix это только набросок, практически в готовом виде использовать нельзя.
Потому как еще один недостаток виден операторы считаются разделителями а они в xWord.fts могут быть только
односимвольными
В реальных синтаксисах есть и многосимвольные операторы например:
>> << => <=
тогда смотрим моё решение (оно самое первое) - может быть удастся его использовать - оно как-раз заготовка к реальной программе и работает при самых рапзных образцах строк (ошибки тоже распознаёт)

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

и файл, положенный на onlinedisk
исчез, :o :(
но там всё понятно

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

Так :idea: >postfix от mOleg-а переделал на многосимвольные операторы.
Надо еще решить прамблему со знаком числа и тогда выложу, дабы каждый мог ногами попинать :cry: .
Но сегодня от этой жары мозги отказываются работать напрочь.

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