Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Ср авг 01, 2007 08:55 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Гм, вот тут мне подумалось, ведь можно словарь рассматривать, как некий конечный автомат
И так далее...
А вообще я так и не понял, чем предложенное Азаматом лучше, чем SWITCH ... ENDSWITCH из SMAL32 и кажется были с подобным названием же буржуйские реализации?
Кстати в ту же степь идет тема с множественными DOES> что лично мне уже гораздо интереснее
хотя простой реализации я пока что так и не придумал 8(
но всему свое время
Гм, вот тут мне подумалось, ведь можно словарь рассматривать, как некий конечный автомат 8)
И так далее...
А вообще я так и не понял, чем предложенное Азаматом лучше, чем SWITCH ... ENDSWITCH из SMAL32 и кажется были с подобным названием же буржуйские реализации?
Кстати в ту же степь идет тема с множественными DOES> что лично мне уже гораздо интереснее 8)
хотя простой реализации я пока что так и не придумал 8(
но всему свое время 8)
|
|
|
|
Добавлено: Ср авг 01, 2007 07:37 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: Осторожно!.. Мечу бисер. не все и не всегда в состояни распознать бисер
[quote]Осторожно!.. Мечу бисер.[/quote]не все и не всегда в состояни распознать бисер
|
|
|
|
Добавлено: Пт июл 27, 2007 01:37 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Чт июл 26, 2007 23:26 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Так там, кажется, речь шла о перебивке ядра на русский. Это плохо из-за неоднозначности и удобства "каждому по-своему". А в своем проекте, не предназначенном для всех-всех-всех, переменные почему бы не по-русски? И самому удобно, и во время отладки-обсуждения можно коллегам показывать не в стиле "вот честное слово, тут работает!", а обычный русский текст, из которого и семантика ясна.
Так там, кажется, речь шла о перебивке ядра на русский. Это плохо из-за неоднозначности и удобства "каждому по-своему". А в своем проекте, не предназначенном для всех-всех-всех, переменные почему бы не по-русски? И самому удобно, и во время отладки-обсуждения можно коллегам показывать не в стиле "вот честное слово, тут работает!", а обычный русский текст, из которого и семантика ясна.
|
|
|
|
Добавлено: Чт июл 26, 2007 23:20 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Чт июл 26, 2007 23:15 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: Наработка уже немножко выросла из коротких штанишек (хотя и не избавилась до конца от своих родовых, студенческих пятен — например, имён переменных и процедур на русском языке [sic!],
А мне тааак нравится по-русски писать!...
Думается, родовые студенческие пятна - они несколько другие
[quote]Наработка уже немножко выросла из коротких штанишек (хотя и не избавилась до конца от своих родовых, студенческих пятен — например, имён переменных и процедур на русском языке [sic!], [/quote]
:))
А мне тааак нравится по-русски писать!... :pilot2;
Думается, родовые студенческие пятна - они несколько другие ;)
|
|
|
|
Добавлено: Чт июл 26, 2007 23:08 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
|
|
|
Добавлено: Чт июл 26, 2007 22:48 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Конечные автоматы на деревьях:
dr-klm писал(а): Эти автоматы -- FTA (Finite Tree Automation), NFTA (Non-deterministic FTA), DFTA (Deterministic FTA) являются обобщением конечных автоматов (FA, NFA, DFA), работающих со строками (т.е. с линейным входом), на случай, когда вход автомата представляет собой дерево. В основном используются в теории (и практике реализации) компиляторов (для генерации кода и оптимизации). ... Парсеры делаются на обычных автоматах. Исходный текст -- строка, результат -- дерево. При помощи этих автоматов деревья удобно "окучивать".
[url=http://dr-klm.livejournal.com/110725.html]Конечные автоматы на деревьях[/url]:
[quote="dr-klm"]Эти автоматы -- FTA (Finite Tree Automation), NFTA (Non-deterministic FTA), DFTA (Deterministic FTA) являются обобщением конечных автоматов (FA, NFA, DFA), работающих со строками (т.е. с линейным входом), на случай, когда вход автомата представляет собой дерево. В основном используются в теории (и практике реализации) компиляторов (для генерации кода и оптимизации).
...
Парсеры делаются на обычных автоматах. Исходный текст -- строка, результат -- дерево. При помощи этих автоматов деревья удобно "окучивать". ;-)[/quote]
|
|
|
|
Добавлено: Пт фев 09, 2007 23:28 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Несколько улучшенный вариант предыдущей FSM, более структурный. к структуре можно добавлять
различные поля: семафоры, флаги, ссылки на родительскую FSM и т.д.
Код: S" locals.f" INCLUDED
: ?ALLOT HERE SWAP ALLOT ;
0 CELL -- states CELL -- inputs CELL -- vexec CELL -- vnext CONSTANT fsm0
CREATE tFSM fsm0 ALLOT
: FSM: { Ns Ni ptr \ m }
Ns Ni * CELLS -> m
m ?ALLOT ptr vexec ! m ?ALLOT ptr vnext !
Ni ptr inputs !
ptr 0 ;
\ terminated definitions of FSM
: FSM; 2DROP ;
\ execute one step in FSM (ptr) with input N
: [cur] ( ptr -- cur ) DUP states @ SWAP inputs @ CELLS * ;
: FSM! ( N ptr -- ) { ptr \ org }
( N ) CELLS ptr [cur] + -> org
ptr vexec @ org + @ EXECUTE
ptr vnext @ org + @ ptr states !
;
: [[ ( ptr org -- ptr org' ) OVER vexec @ OVER + ' SWAP ! ;
: ]] ( ptr org N -- ptr org ) >R OVER vnext @ OVER + R> SWAP ! CELL+ ;
: | ]] [[ ;
\ set state FSM -- 0 ptr states ! ; get state FSM -- ptr states @
\ === EXAMPLE ============================================
: DIGIT? ( N -- FLAG) [CHAR] 0 [CHAR] : WITHIN ; : DP? ( N --FLAG ) [CHAR] . = ; : MINUS? ( N --FLAG) [CHAR] - = ;
: CAT->COL# ( C -- N ) DUP DIGIT? 1 AND \ DIGIT -> 1 OVER MINUS? 2 AND + \ - -> 2 SWAP DP? 3 AND + \ DP -> 3 ; \ OTHER -> 0
3 4 tFSM FSM: \ i n p u t s \ \ state: other? digit? minus? dp? \ ( 0 ) [[ DROP 0 | EMIT 1 | EMIT 1 | EMIT 2 ]] ( 1 ) [[ DROP 1 | EMIT 1 | DROP 1 | EMIT 2 ]] ( 2 ) [[ DROP 2 | EMIT 2 | DROP 2 | DROP 2 ]] FSM;
: AAA
0 tFSM states !
BEGIN KEY DUP 13 <> OVER 10 <> AND WHILE DUP CAT->COL# tFSM FSM! REPEAT
DROP
;
Несколько улучшенный вариант предыдущей FSM, более структурный. к структуре можно добавлять
различные поля: семафоры, флаги, ссылки на родительскую FSM и т.д.
[code] S" locals.f" INCLUDED
: ?ALLOT HERE SWAP ALLOT ;
0 CELL -- states CELL -- inputs CELL -- vexec CELL -- vnext CONSTANT fsm0
CREATE tFSM fsm0 ALLOT
: FSM: { Ns Ni ptr \ m }
Ns Ni * CELLS -> m
m ?ALLOT ptr vexec ! m ?ALLOT ptr vnext !
Ni ptr inputs !
ptr 0 ;
\ terminated definitions of FSM
: FSM; 2DROP ;
\ execute one step in FSM (ptr) with input N
: [cur] ( ptr -- cur ) DUP states @ SWAP inputs @ CELLS * ;
: FSM! ( N ptr -- ) { ptr \ org }
( N ) CELLS ptr [cur] + -> org
ptr vexec @ org + @ EXECUTE
ptr vnext @ org + @ ptr states !
;
: [[ ( ptr org -- ptr org' ) OVER vexec @ OVER + ' SWAP ! ;
: ]] ( ptr org N -- ptr org ) >R OVER vnext @ OVER + R> SWAP ! CELL+ ;
: | ]] [[ ;
\ set state FSM -- 0 ptr states ! ; get state FSM -- ptr states @
\ === EXAMPLE ============================================
: DIGIT? ( N -- FLAG) [CHAR] 0 [CHAR] : WITHIN ; : DP? ( N --FLAG ) [CHAR] . = ; : MINUS? ( N --FLAG) [CHAR] - = ;
: CAT->COL# ( C -- N ) DUP DIGIT? 1 AND \ DIGIT -> 1 OVER MINUS? 2 AND + \ - -> 2 SWAP DP? 3 AND + \ DP -> 3 ; \ OTHER -> 0
3 4 tFSM FSM: \ i n p u t s \ \ state: other? digit? minus? dp? \ ( 0 ) [[ DROP 0 | EMIT 1 | EMIT 1 | EMIT 2 ]] ( 1 ) [[ DROP 1 | EMIT 1 | DROP 1 | EMIT 2 ]] ( 2 ) [[ DROP 2 | EMIT 2 | DROP 2 | DROP 2 ]] FSM;
: AAA
0 tFSM states !
BEGIN KEY DUP 13 <> OVER 10 <> AND WHILE DUP CAT->COL# tFSM FSM! REPEAT
DROP
;
[/code]
|
|
|
|
Добавлено: Чт янв 04, 2007 11:12 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Привет, адаптация FSM (конечного автомата) от J.V.Noble под spf4
Код: \ ============================================================================= \ FSM Records M=NSTATES*NINPUTS \ ptr -++- to FSM \ || \ \/ \ \ | FSM states | FSM inputs | exec-word1 | next-state1 | . . . | exec-wordM | next-stateM | \ =============================================================================
: ?ALLOT HERE SWAP ALLOT ;
: FSM: ( NSTATES NINPUTS -- ) CREATE 2DUP * CELLS 2* 2 CELLS + ?ALLOT DUP >R CELL+ ! DROP R> 2 CELLS + ;
\ terminated definitions of FSM
: FSM; DROP ;
\ execute one step in FSM (ptr) with input N
: FSM! ( N ptr -- ) DUP >R 2@ * + 2* 2+ CELLS R@ + DUP >R @ EXECUTE R> CELL+ @ R> ! ;
: [[ ( ADDR1 -- ADDR2 ) ' OVER ! CELL+ ; : ]] ( ADDR2 N -- ADDR3 ) OVER ! CELL+ ; : | ]] [[ ;
\ === EXAMPLE ============================================
\ : WITHIN OVER - >R - R> U< ;
: DIGIT? ( N -- FLAG) [CHAR] 0 [CHAR] : WITHIN ; : DP? ( N --FLAG ) [CHAR] . = ; : MINUS? ( N --FLAG) [CHAR] - = ;
: CAT->COL# ( C -- N ) DUP DIGIT? 1 AND \ DIGIT -> 1 OVER MINUS? 2 AND + \ - -> 2 SWAP DP? 3 AND + \ DP -> 3 ; \ OTHER -> 0
3 4 FSM: <FIXED> \ i n p u t s \ \ state: other? digit? minus? dp? \ ( 0 ) [[ DROP 0 | EMIT 1 | EMIT 1 | EMIT 2 ]] ( 1 ) [[ DROP 1 | EMIT 1 | DROP 1 | EMIT 2 ]] ( 2 ) [[ DROP 2 | EMIT 2 | DROP 2 | DROP 2 ]] FSM;
: AAA 0 <FIXED> ! BEGIN KEY DUP 13 <> OVER 10 <> AND WHILE DUP CAT->COL# <FIXED> FSM! REPEAT DROP ;
Привет, адаптация FSM (конечного автомата) от J.V.Noble под spf4
[code]\ ============================================================================= \ FSM Records M=NSTATES*NINPUTS \ ptr -++- to FSM \ || \ \/ \ \ | FSM states | FSM inputs | exec-word1 | next-state1 | . . . | exec-wordM | next-stateM | \ =============================================================================
: ?ALLOT HERE SWAP ALLOT ;
: FSM: ( NSTATES NINPUTS -- ) CREATE 2DUP * CELLS 2* 2 CELLS + ?ALLOT DUP >R CELL+ ! DROP R> 2 CELLS + ;
\ terminated definitions of FSM
: FSM; DROP ;
\ execute one step in FSM (ptr) with input N
: FSM! ( N ptr -- ) DUP >R 2@ * + 2* 2+ CELLS R@ + DUP >R @ EXECUTE R> CELL+ @ R> ! ;
: [[ ( ADDR1 -- ADDR2 ) ' OVER ! CELL+ ; : ]] ( ADDR2 N -- ADDR3 ) OVER ! CELL+ ; : | ]] [[ ;
\ === EXAMPLE ============================================
\ : WITHIN OVER - >R - R> U< ;
: DIGIT? ( N -- FLAG) [CHAR] 0 [CHAR] : WITHIN ; : DP? ( N --FLAG ) [CHAR] . = ; : MINUS? ( N --FLAG) [CHAR] - = ;
: CAT->COL# ( C -- N ) DUP DIGIT? 1 AND \ DIGIT -> 1 OVER MINUS? 2 AND + \ - -> 2 SWAP DP? 3 AND + \ DP -> 3 ; \ OTHER -> 0
3 4 FSM: <FIXED> \ i n p u t s \ \ state: other? digit? minus? dp? \ ( 0 ) [[ DROP 0 | EMIT 1 | EMIT 1 | EMIT 2 ]] ( 1 ) [[ DROP 1 | EMIT 1 | DROP 1 | EMIT 2 ]] ( 2 ) [[ DROP 2 | EMIT 2 | DROP 2 | DROP 2 ]] FSM;
: AAA 0 <FIXED> ! BEGIN KEY DUP 13 <> OVER 10 <> AND WHILE DUP CAT->COL# <FIXED> FSM! REPEAT DROP ; [/code]
|
|
|
|
Добавлено: Чт янв 04, 2007 11:06 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Пример использования. Сразу двойной.
Дано: желание почитать в выходные (сегодня) книжку. У книжки формат [url=http://www.fictionbook.org/index.php/FictionBook_2.0_-_краткая_информация]FB2[/url]. С форматом этим я борюсь спец. XSL-преобразователем, который делает мне из файла Word'овский файл с нужным мне форматированием для распечатки (альбомная ориентация, три колонки, расстановка переносов, оформление заголовков и абзацов). И всё бы хорошо если бы не иллюстрации. В FB2 они внедряются в исходный текст, в тэг binary через base64. Раньше обходился и вручную вставлял картинку, но у сегодняшней книжки туча иллюстраций.
Хорошо, за два часа программа слеплена и я могу печатать и зачитываться:
Код: REQUIRE FILE ~ac/lib/str4.f REQUIRE открыть-тэг ~profit/lib/xmlscanner.f REQUIRE COMPARE-U ~ac/lib/string/compare-u.f REQUIRE base64 ~ac/lib/string/conv.f REQUIRE split ~profit/lib/bac4th-str.f REQUIRE взять-параметр ~profit/lib/parsecommand.f
REQUIRE ZPLACE ~nn/lib/az.f CREATE tmp 100 ALLOT
0 VALUE двоичный-тэг? 0 VALUE вывод
:NONAME S" binary" COMPARE-U 0= TO двоичный-тэг? ; TO открыть-тэг
:NONAME двоичный-тэг? IF S" id" COMPARE-U 0= IF убрать-кавычки
вывод IF вывод CLOSE-FILE THROW THEN
tmp ZPLACE tmp ASCIIZ> R/W CREATE-FILE THROW TO вывод
ELSE 2DROP THEN ELSE 2DROP 2DROP THEN ; TO внести-атрибут :NONAME двоичный-тэг? IF ( addr u ) START{ byRows split \ из текста нужно убрать переводы строк DUP STR@ debase64 вывод WRITE-FILE THROW }EMERGE ELSE 2DROP THEN ; TO внести-текст
: вычленить-изображения ( addr u -- ) 1 TO размер-символа SWAP поставить-курсор в-тексте -символов-обработать ;
:NONAME GetCommandLineA начать-обрабатывать-командную-строку взять-параметр 2DROP взять-параметр FILE вычленить-изображения BYE ; MAINX ! 0 TO SPF-INIT? TRUE TO ?GUI S" extractImg.exe" SAVE BYE
На вход командной строки получает имя FB2-файла, и если в его дереве есть узлы с именем "binary", то их текстовое содержимое будет раскодировано из base64 и положено в файлы с названием из атрибута "id" этого узла.
Сканер используется и в ~profit/lib/parsecommand.f, и в ~profit/lib/xmlscanner.f (да, я знаю что этот недо-сканер неправильно обрабатывает тэги вида "<tag />").
Пример использования. Сразу двойной.
Дано: желание почитать в выходные (сегодня) книжку. У книжки формат [url=http://www.fictionbook.org/index.php/FictionBook_2.0_-_краткая_информация]FB2[/url]. С форматом этим я борюсь спец. XSL-преобразователем, который делает мне из файла Word'овский файл с нужным мне форматированием для распечатки (альбомная ориентация, три колонки, расстановка переносов, оформление заголовков и абзацов). И всё бы хорошо если бы не иллюстрации. В FB2 они внедряются в исходный текст, в тэг binary через base64. Раньше обходился и вручную вставлял картинку, но у [url=http://www.fictionbook.ru/author/anisimov_sergeyi/variant_bis_s_illyustraciyami/]сегодняшней книжки[/url] туча иллюстраций.
Хорошо, за два часа программа слеплена и я могу печатать и зачитываться:
[code]REQUIRE FILE ~ac/lib/str4.f REQUIRE открыть-тэг ~profit/lib/xmlscanner.f REQUIRE COMPARE-U ~ac/lib/string/compare-u.f REQUIRE base64 ~ac/lib/string/conv.f REQUIRE split ~profit/lib/bac4th-str.f REQUIRE взять-параметр ~profit/lib/parsecommand.f
REQUIRE ZPLACE ~nn/lib/az.f CREATE tmp 100 ALLOT
0 VALUE двоичный-тэг? 0 VALUE вывод
:NONAME S" binary" COMPARE-U 0= TO двоичный-тэг? ; TO открыть-тэг
:NONAME двоичный-тэг? IF S" id" COMPARE-U 0= IF убрать-кавычки
вывод IF вывод CLOSE-FILE THROW THEN
tmp ZPLACE tmp ASCIIZ> R/W CREATE-FILE THROW TO вывод
ELSE 2DROP THEN ELSE 2DROP 2DROP THEN ; TO внести-атрибут :NONAME двоичный-тэг? IF ( addr u ) START{ byRows split \ из текста нужно убрать переводы строк DUP STR@ debase64 вывод WRITE-FILE THROW }EMERGE ELSE 2DROP THEN ; TO внести-текст
: вычленить-изображения ( addr u -- ) 1 TO размер-символа SWAP поставить-курсор в-тексте -символов-обработать ;
:NONAME GetCommandLineA начать-обрабатывать-командную-строку взять-параметр 2DROP взять-параметр FILE вычленить-изображения BYE ; MAINX ! 0 TO SPF-INIT? TRUE TO ?GUI S" extractImg.exe" SAVE BYE[/code]
На вход командной строки получает имя FB2-файла, и если в его дереве есть узлы с именем "binary", то их текстовое содержимое будет раскодировано из base64 и положено в файлы с названием из атрибута "id" этого узла.
Сканер используется и в [url=http://spf.cvs.sourceforge.net/spf/devel/~profit/lib/parsecommand.f]~profit/lib/parsecommand.f[/url], и в [url=http://spf.cvs.sourceforge.net/spf/devel/~profit/lib/xmlscanner.f]~profit/lib/xmlscanner.f[/url] (да, я знаю что этот недо-сканер неправильно обрабатывает тэги вида "<tag />").
|
|
|
|
Добавлено: Пн дек 18, 2006 22:13 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: И наконец залить всё на CVS.
Вчера.
[quote]И наконец залить всё на CVS.[/quote]
[url=http://spf.cvs.sourceforge.net/spf/devel/~profit/lib/chartable.f]Вчера[/url].
|
|
|
|
Добавлено: Ср окт 11, 2006 23:05 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: Я просмотрел или как добыть текущий символ, т.е. например в ветке все: как узнать что за символ сейчас в автомате? Есть слово "символ" (самое первое определение в библиотеке). Цитата: Стековых комментариев добавить. ... Оформить в виде модуля.
Угу. Цитата: Примеры (те что в этом треде) добавить в саму либу. Чего-то мне кажется что немножко большие примеры, впрочем ладно. Цитата: И наконец залить всё на CVS.
Там сперва нужно обеспечить собственно работоспособность. То есть нужно будет тянуть несколько доп. библиотек. Потом, я там недавно поломал функционал, увлёкшись FOR.. NEXT. Когда отеложу вдоль и поперёк, тогда и выложу спокойно.
Опять же меня ещё тревожит вопрос о языке (русские названия слов), но это уже другая немного тема...
[quote]Я просмотрел или как добыть текущий символ, т.е. например в ветке все: как узнать что за символ сейчас в автомате?[/quote]
Есть слово "символ" (самое первое определение в библиотеке).
[quote]Стековых комментариев добавить. ... Оформить в виде модуля. [/quote]Угу.
[quote]Примеры (те что в этом треде) добавить в саму либу.[/quote] Чего-то мне кажется что немножко большие примеры, впрочем ладно.
[quote]И наконец залить всё на CVS.[/quote]
Там сперва нужно обеспечить собственно работоспособность. То есть нужно будет тянуть несколько доп. библиотек. Потом, я там недавно поломал функционал, увлёкшись FOR.. NEXT. Когда отеложу вдоль и поперёк, тогда и выложу спокойно.
Опять же меня ещё тревожит вопрос о языке (русские названия слов), но это уже другая немного тема...
|
|
|
|
Добавлено: Ср окт 04, 2006 19:07 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Я просмотрел или как добыть текущий символ, т.е. например в ветке все: как узнать что за символ сейчас в автомате?
Например так
Код: : этот-символ отсюда размер-символа - размер-символа взять-букву ;
Пожелания:
Стековых комментариев добавить.
Примеры (те что в этом треде) добавить в саму либу.
Оформить в виде модуля.
И наконец залить всё на CVS.
Я просмотрел или как добыть текущий символ, т.е. например в ветке [b]все:[/b] как узнать что за символ сейчас в автомате?
Например так
[code]: этот-символ отсюда размер-символа - размер-символа взять-букву ;[/code]
Пожелания:
Стековых комментариев добавить.
Примеры (те что в этом треде) добавить в саму либу.
Оформить в виде модуля.
И наконец залить всё на CVS.
|
|
|
|
Добавлено: Ср окт 04, 2006 17:32 |
|
|
|
|