Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт ноя 15, 2018 06:32

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9, 10  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 11, 2009 19:42 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Так что для меня этот код видится чорным ящиком с множеством странных, непонятных и сложно-взаимосвязанных
Но из словесного описания принцип действия понятен?

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 11, 2009 20:48 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1255
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
вопрос писал(а):
(Злорадно) А вот почему я С++ читаю без напряга (почти)...

Ну так привычка и практика.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 19, 2009 22:08 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
достаточно своеобразное решение, сделано под форк
контроля ошибок нет (и не надо в данном случае)
все поддерживаемые операции спрятаны в отдельный словарь (можно подключать другой словарь с другим набором)
алгоритм прост - берем следующую лексему, если это оператор - обрабатываем как оператор, если операнд - просто
добавляем во внешний буфер.
допустимые операции:
присвоение - : то есть a:b эквивалентно a b !
отделение - ; разбивает выражение на два , то есть a+b=d; d+e=f
извлечение - [ ] по результату выражения в скобках берется значение из памяти: [base+index*size]=123
другие скобки просто группируют выражения (меняют приоритет)

\ 19.02.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ преобразование префиксной записи в постфиксную

string/ xWord.fts
stack/ stack.fts
memory/ box.fts
memory/ buff.fts

VOCABULARY TRANSL
ALSO TRANSL DEFINITIONS

0xF00 CONSTANT buff#
USER-VALUE OutBuff

\ копировать содержимое строки в выходной буфер
: s>out ( asc # --> )
OutBuff >Buffer
IFNOT ERROR" Слишком длинная выходная строка!" THEN ;

\ переместить символ в выходной буфер
: c>out ( char --> ) SP@ 1 s>out DROP ;

\ если строка имеет не нулевую длину, добавить ее в выходной буфер
: ~oper ( asc # --> ) *IF s>out Bl_ c>out ;THEN DDROP ;

\ --------------------------------------------------------------------------

\ список поддерживаемых односимвольных операторов и разделителей:
s" /%^+-* &|~ [] () {} <=> :; " Delimiter: separators

0 VALUE oplist \ список операторов

\ является ли лексема оператором?
: ?operator ( asc # --> asc # 0 | addr true )
DDUP oplist SEARCH-WORDLIST *IF DSWAP DDROP THEN ;

\ вернуть строку, содержащую символ из текущей позиции входного потока
: GetSep ( --> asc # ) CharAddr 1 SkipChar ;

\ взять очередную лексему/оператор
: GetOp ( --> operand 0 | addr true )
separators xWord DUP IFNOT DDROP GetSep THEN ?operator ;

\ --------------------------------------------------------------------------

USER-VALUE operators \ стек для хранения отложенных операторов
0x20 CONSTANT operators# \ количество ячеек в стеке операторов

\ втолкнуть оператор на стек операторов
: adjourn ( addr --> ) operators PushTo ;
\ вытолкнуть оператор из стека операторов
: stretch ( --> addr ) operators PopFrom ;
\ прочесть верхний оператор в стеке операторов
: topmost ( --> addr ) operators ReadTop ;

\
: any ( --> # ) operators StackDepth ;

\ --------------------------------------------------------------------------

\ вернуть приоритет операции
: priority ( 'op --> pri ) B@ ;
\ добавить имя операции в выходной буфер
: operator ( 'op --> ) *IF 1 + COUNT ~oper ;THEN DROP ;

\ двухместная операция, то есть когда есть операнд слева и справа от операции
: twoseater ( 'op --> )
>L BEGIN topmost WHILE
topmost priority L@ priority < WHILENOT
stretch operator
REPEAT
THEN
L> adjourn ;

\ открывающая скобка
: LeftBracket ( 'op --> )
0 adjourn
twoseater ;

: <= ( n --> flag ) > 0 = ;

\ закрывающая скобка
: RigthBracket ( 'op --> )
>L BEGIN topmost WHILE
topmost priority L@ priority <= WHILE
stretch operator
REPEAT
THEN stretch DROP \ удаление нуля
L> adjourn ;

VOCABULARY OPERATORS \ словарь, в котором находится список операций
ALSO OPERATORS CONTEXT @ TO oplist
THIS \ отсюда перечисляется список поддерживаемых операций -----------------

s" " S: ; \ пробелы просто пропускаются

: < BOX[ 2 B, s" <" S", ]BOX twoseater ; \ меньше?
: > BOX[ 2 B, s" >" S", ]BOX twoseater ; \ больше?
: = BOX[ 2 B, s" =" S", ]BOX twoseater ; \ равно?

: + BOX[ 3 B, s" +" S", ]BOX twoseater ;
: - BOX[ 3 B, s" -" S", ]BOX twoseater ;

: * BOX[ 4 B, s" *" S", ]BOX twoseater ;
: / BOX[ 4 B, s" /" S", ]BOX twoseater ;
: % BOX[ 4 B, s" MOD" S", ]BOX twoseater ;

: & BOX[ 5 B, s" AND" S", ]BOX twoseater ; \ AND
: | BOX[ 5 B, s" OR" S", ]BOX twoseater ; \ OR
: ~ BOX[ 5 B, s" XOR" S", ]BOX twoseater ; \ XOR

: ^ BOX[ 6 B, s" ^" S", ]BOX twoseater ; \ возведение в степень

: ( BOX[ 7 B, s" " S", ]BOX LeftBracket ; \ открывающая ( скобка
: ) BOX[ 7 B, s" " S", ]BOX RigthBracket ; \ закрывающая ) скобка

: { BOX[ 8 B, s" " S", ]BOX LeftBracket ; \ открывающая { скобка
: } BOX[ 8 B, s" " S", ]BOX RigthBracket ; \ закрывающая } скобка

: [ BOX[ 9 B, s" " S", ]BOX LeftBracket ; \ открывающая [ скобка
: ] BOX[ 9 B, s" @" S", ]BOX RigthBracket ; \ извлечение значения

: : BOX[ 1 B, s" !" S", ]BOX twoseater ; \ правое присвоение: x=>y
: ; BOX[ 0 B, s" " S", ]BOX twoseater ; \ разделитель выражений

DEFINITIONS \ --------------------------------------------------------------

\ инициализировать стеки, необходимые переменные
: init ( --> )
operators IFNOT operators# NewStack TO operators THEN
operators ClearStack 0 adjourn
OutBuff *IF Clean ELSE DROP buff# Buffer TO OutBuff THEN
;

\ разбор выражения до конца строки
: expression ( asc # --> asc # )
init

StrSource SetSource

BEGIN EndOfChunk WHILENOT
GetOp IF EXECUTE ELSE ~oper THEN
REPEAT

BEGIN any WHILE stretch operator REPEAT

ExitSource

OutBuff Buffer> ;

RECENT ALSO TRANSL

\ взять выражение до конца строки, преобразовать его в постфикс, отобразить
: expr ( / expression --> )
Cr_ PARSE
DDUP TYPE ." == "
expression TYPE ;

\ преобразовать префиксную запись в постфиксную
: >postfix ( asc # --> asc # ) expression ;

PREVIOUS

\ EOF примеры использования ------------------------------------------------

CR expr a+b+c+d
CR expr a+ b+c+d
CR expr a +b+c+d
CR expr a + b+c+d
CR expr (a+b+c)+d
CR expr a+(b+c)+d
CR expr a=b+c*d&e
CR expr a&b*c+d=e
CR expr a:b+(c*d)
CR expr [base+index*n]>0
CR expr a+b*(a*(c+d))
CR expr ((a+b*a)+c)*d
CR expr a =((c+d*(e-f))-((h-g)*i))/z

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Последний раз редактировалось mOleg Ср ноя 11, 2009 11:57, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 19, 2009 22:16 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
преобразование префиксной записи в инфиксную
именно так?

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 19, 2009 22:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
вопрос писал(а):
преобразование префиксной записи в инфиксную
именно так?

пардон, исправил, конечно префиксной в постфиксную

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 06, 2009 00:43 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Mihail писал(а):
Только ненужно это. Изначально программа должна быть максимально простой.
За тем, решать только те проблемы, которые встретились на практике.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 11, 2009 12:02 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
добавлены исправления в мой вариант преобразование скобочной записи в постфикс
исправлены последние ошибки, обнаруженные вопрос-ом : большое спасибо за помощь.
была ошибка при сравнении приоритета, вместо <> (не равно) надо было <= (меньше или равно).
предложенные тесты проходят. Как и ранее работает с форком

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 11, 2009 12:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
вопрос писал(а):
Mihail писал(а): Только ненужно это. Изначально программа должна быть максимально простой.
За тем, решать только те проблемы, которые встретились на практике.

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

так поделись выводом вывода 8) почему же так?

к тому же, любой проект развивается "спирально", и "ничто так не улучшает программу, как потеря ее исходников" 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 11, 2009 14:50 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
вопрос писал(а):
Mihail писал(а): Только ненужно это. Изначально программа должна быть максимально простой.
За тем, решать только те проблемы, которые встретились на практике.

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

так поделись выводом вывода 8) почему же так?

к тому же, любой проект развивается "спирально", и "ничто так не улучшает программу, как потеря ее исходников" 8)

НА самом деле, любой код, который не стремится быть как бы образцом решения типовой задачи
1. используется однократно - что преступление
2. трудно проверяем на правильность (т.к. представляет собою частный случай)
3. не мотивирует на исчерпывающее тестирование
4. не мотивирует на "академическую" функциональность - т.е. обязательно односторонний и неприменимый "в другом месте"

Что легче создать: "функцию сравнения стандартных строк" или "функцию сравнения некоторых особенных строк в некотором особом случае для некоторого сообого компилятора" ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 11, 2009 14:53 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
поэтому максимальная простота программы оборачивается
1. недоделанностью (частный случай - несоответствием стандарту)
2. недотестированностью (в частности потому. что сложно реализовать все тестовые надстройки)
3. ограниченной функциональностью


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 11, 2009 17:43 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
вопрос писал(а):
поэтому максимальная простота программы оборачивается
1. недоделанностью (частный случай - несоответствием стандарту)
2. недотестированностью (в частности потому. что сложно реализовать все тестовые надстройки)
3. ограниченной функциональностью


если речь о конечном продукте, то спорить не о чем - ты прав!
если же речь идет о
- иллюстрации принципа,
- наброске
- скелете проекта
то я полностью не согласен с тобой 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 07, 2010 12:15 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
Вопрос к mOleg-у :!:
Столкнулся с проблемой при попытке интерпретации полученой с помщью >postfix строки.
Хотя выяснилось что дело не в >postfix-е а в буфере но пишу здесь.
Вобщем так текст помещеный в буфер созданны с помощью memory/ buff.fts
при попытке его интерпретации EVALUATE вызывает вылет без вывода сообщений.

Ну к примеру вот так:
Код:
0x1000 Buffer VALUE buf
s" 1 2 +" buf >Buffer . \ Здесь TRUE
buf Buffer>
EVALUATE \ <- Здесь Вылет

А вот так:
Код:
0x1000 Buffer VALUE buf
s" 1 2 +" buf >Buffer DROP
buf Buffer> S>HEAP \ Перебросим в другое место
COUNT
EVALUATE \ <- Здесь все ок! (на стеке 3)
От не пойму :?: в чем разница.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 07, 2010 19:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
_Harry писал(а):
Вопрос к mOleg-у

ок, посмотрю.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Чт июл 08, 2010 16:03 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
Опять к mOleg :?:
Интересно это по правилам какого языка
Код:
s" a:b" >postfix TYPE
a b !  ok (0)
Ни Cи ни Паскаль ни Басик вроде такого не имеют.
Может лучше этот оператор исключить :?:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Чт июл 08, 2010 17:51 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
_Harry писал(а):
Интересно это по правилам какого языка

никакого, я делал пример, того, как можно реализовать присваивание.
Можно вместо: сделать ':=' к примеру, но я не предусматривал разбор таких последовательностей в данном примере.

_Harry писал(а):
Может лучше этот оператор исключить

неа, зачем? мне и так нравится ;)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9, 10  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB