Создание простого транслятора forth
Участников: 3
Страница 2 из 4
Страница 2 из 4 • 1, 2, 3, 4
Re: Создание простого транслятора forth
Строки, черновой набросок.
После того, как разобрались с вызовом функций и передачей параметров,
реализовать нужную строковую функцию можно за пять минут.
Поэтому общий набросок
Теперь самая мутная часть, написание самого форта.
Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще.
После того, как разобрались с вызовом функций и передачей параметров,
реализовать нужную строковую функцию можно за пять минут.
Поэтому общий набросок
- Код:
void StringLib() {
int nf = stack.pop(); // получение номера ф-ции
int ind; //
String str = null;
switch (nf) {
case 0 : // 0 - создать строку
int sf = stack.pop(); // получение номера подфункции
switch (sf) {
case 7 : // создать копию строки, которая имеет индекс ind
ind = stack.pop();
str = new String( (String) V.elementAt( ind ) );
stack.push( // положить елемент вектора со строкой на стек
appendData( V, str) //добавление новой строки в вектор
);
breake;
case 11 :
// создать строку другим способом
breake;
}//switch 2
breake;
case 1 : // сравнить строки, равны - на стеке 0
// на стеке ind1, ind0 --> 0 если равны
String s0 = (String) V.elementAt( stack.pop() ) ;
String s1 = (String) V.elementAt( stack.pop() ) ;
stack.push( s0.compareTo(s1) );
breake;
///-- другие функции ...///
}//switch
}
Теперь самая мутная часть, написание самого форта.
Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
vikt144 пишет:Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще.
Выше в этой теме:
Gudleifr пишет:char s[256]; main() { while(1) gets(s); }
Gudleifr пишет:начинать надо не с осмысления всего взаимодействия системы в целом, а тупо с рисовании на бумажке приведенного выше рисунка с указанием, что, с чем, какими средствами и на какой машине я НА ДАННЫЙ МОМЕНТ делаю. Затем - добавлять и удалять к этому рисунку петли для приближения к ИДЕАЛУ.
Вы же сами написали:
Опишите формально машину, в которую "все это интегрируется".vikt144 пишет:Но это более менее интегрируется со старым, работающим кодом.
Возможно, тут Важно понять, как появился FORTH. Расхожая байка микрофортеров - "FORTH разработан для управления телескопом" - не имеет никакого отношения к реальности. Мур пишет, что проблема была не в "телескопе", а в том, что было лень перфорировать и компилировать программу заново при каждом новом изменении данных. Поэтому он задумался о вынесении "изменяемых данных" на отдельные перфокарты, не трогая "основной программы". Постепенно он понял, что "язык данных" должен быть достаточно сложным, чтобы можно было не просто "подставлять данные", но и "комбинировать операции". Но, при этом, с каждым шагом "основная программа" все более сокращалась и вырождалась в набор "специфических операций с железом" (как у Вас). Использовав FORTH-машину Дейкстры, Мур смог устранить противоречие между желанием "уменьшить изменяемую часть" и возможностью "все описать в изменяемой части".
Поэтому, прежде чем решить, с чего начать, Вы должны нарисовать на бумажке схему взаимодействия "частей" и "машин".
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Android от 2,7 и старше версий.Gudleifr пишет:
Опишите формально машину, в которую "все это интегрируется".
J2me (старые мобильные телефоны с ява)
Программируются исключительно на java.
Андроид имеет нативные методы, то есть с ограничениями предусмотрен си и асм,
но это не кроссплатформенно, поэтому не интересно.
Описанная здесь виртуальная машина, это надстройка над реальным железом,
Ее возможностей вполне хватает для текущих задач. Возможно добавлять команды,
для повышения эффективности, но это тривиальные правки.
Для многозадачности, ее надо серьезно модифицировать, но на это нет времени,
так как навигационная программа мне нужна уже в марте.
Проблемы многозадачности решаются кодом на java.
Gudleifr пишет:
Поэтому, прежде чем решить, с чего начать, Вы должны нарисовать на бумажке схему взаимодействия "частей" и "машин"
Код виртуальной машины здесь вызывается -
- Код:
processImage( int startIP ) // startIP - это адрес в виртуальной машине, с которого начинается исполнение программы.
вызов процедур на java из ВМ
- Код:
out - запись в порт , тут вызывает фцию callService(int x, int y)
in - чтение порта, тут тоже вызывает какую-нибудь ф-цию
wait - вызывает handleDevices()
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Такого описания совершенно недостаточно. Попробую на примерах:vikt144 пишет:Android от 2,7 и старше версий...
1. Машина Мура:
начало:
сама ЭВМ, программатор, позволяющий фигачить в память, дисковая память (не используется), телетайп (не используется);
ввел код в память, запустил его, перезапустил машину;
потом:
+ добавляется код, позволяющий сохранять код на дисках в конце сеанса и считывать - в начале;
+ добавляется код, позволяющий считывать слова с телетайпа;
+ на диске организуется блоковая память.
2. DOS-FOBOS
начало:
IBM-PC, DOS;
создавал код в DEBUG, запускал с нужного адреса, пытался поймать останов, перезапускал повисший компьютер...
потом:
+ обзавелся текстовым редактором, на котором написал код ядра;
+ обзавелся MASM, на котором скомпилировал ядро;
+ для ввода слов и блоковой памяти использовал DOS-API;
+ замкнул операции редактирования, ассемблирования и запуска FORTH DOS-скриптом.
3. WIN-FOBOS
начало:
IBM-PC, WIN32, NOTEPAD, MASM;
тупо ввожу и ассемблирую код ядра, запускаю, скармливая ему остальную часть программы в текстовой форме, никакой возможности доввода программы не предусмотрено.
У Вас все, видимо, сложнее. Наверное, Вы работаете на двух машинах (компилирующей и целевой), возможно используете java-IDE... Но я этого НЕ ЗНАЮ и ЗНАТЬ НЕ МОГУ! Есть 1001 способ писать на java под Android и +100500 способов прицепить туда FORTH и я не понимаю, что и как Вы делаете/хотите.
Я java не знаю. Надеюсь, Вы знаете его настолько хорошо, чтобы быть способным на ТЕМА #43 .vikt144 пишет:Программируются исключительно на java.
P.S. Если Вы считаете, что мои ответы/советы мешают восприятию темы и не по делу, пишите, удалю/сокращу...
Последний раз редактировалось: Gudleifr (Пн Дек 09, 2019 11:40 am), всего редактировалось 1 раз(а)
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
- Код:
Я java не знаю
Возможность нативного программирования на некоторых android устройствах условна,
код обладает низкими правами и переход между java и нативным кодом занимает много времени.
Кто му же различается от модели к модели.
- Код:
Есть 1001 способ писать на java под Android и +100500 способов прицепить туда FORTH и я не понимаю, что и как Вы делаете/хотите.
затруднительно, то хотелось бы получить скриптовый язык хотя бы внутри программы.
Просто программы, которым наращивают функционал, начинают резко расти в размере,
их очень трудно становится модифицировать. Отсюда идея, создавать простую программу
с базовым функционалом, а скриптами реализовывать свои хотелки. Скрипты навешивать
на немногочисленные кнопки.
В результате получается программа, управляемая одной, двумя, тремя кнопками,
мгновенно переконфигурирующаяся в зависимости от ситуации, в отличие от
тяжеленной программы, с кучей вложенных меню.
Критика виртуальных машин мне непонятна.
1) Мне она дает возможность тестировать
ф-ции андроид api, прямо сейчас, не дожидаясь разработки форта.
Навигационная программа мне нужна уже в марте, если она будет без форта, то это досадно,
а если ее не будет, то придется адаптироваться к какой-нибудь популярной
программе (locus, osmand, maps.me и др) Я их использовал, мне не понравилось,
мои корявые разработки мне удобнее.
2) Один раз написал форт под эту ВМ и забыл. Взаимодействие с внешним миром происходит
через порты.
Возможно в будущем взгляды поменяю.
рисунок
FORTH
||
VM
||
java
===========================================
system.api \\ элементы интерфейса api \\ camera.api \\ locations.api \\ bluetooth.api \\ другие api
Последний раз редактировалось: vikt144 (Сб Мар 02, 2019 12:33 am), всего редактировалось 1 раз(а) (Обоснование : добавил рисунок)
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Я не говорю, что java - это хорошо или плохо, я напираю на то, что Вы должны его знать на уровне, позволяющем исполнить указанные выше трюки.vikt144 пишет:На java, это значит только на java
Это я понял сразу. Только я так и не понял, как скрипты будут попадать в программу?vikt144 пишет:то хотелось бы получить скриптовый язык хотя бы внутри программы.
1. Будут честно компилироваться в код на компилирующей машине? (Как любят микрофортеры).
2. Будут вводиться путем добавления константных массивов? (Так обычно добавляют шитые слова в ассемблерный код ядра системы).
3. Будут храниться в отдельном файле (блоке данных), читаемом программой при запуске? (Как у меня в WIN-FOBOS).
4. Будут считываться из блоковой памяти? (Как в старых FORTH).
5. Будут вводится с консоли самой программы? (Как в первых главах книжек по FORTH).
И, да, кто, где и как создает саму программу (без скриптов)?
Вдогонку: кто, где и как создает эти кнопки (дизайн, функционал, привязка к обработчику событий)?vikt144 пишет:В результате получается программа, управляемая одной, двумя, тремя кнопками
Я не против VM, я просто не понимаю, где она написана, где она запускается, откуда получает команды...vikt144 пишет:Критика виртуальных машин мне непонятна.
Последний раз редактировалось: Gudleifr (Пн Дек 09, 2019 11:42 am), всего редактировалось 1 раз(а)
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Делаю по Баранову и Ноздрунову.
Разрабатывать буду на java, для эффективности,
и ассемблере вирт. машины, из любви к исскусству и
в перспективе получить саморазворачивающуюся систему.
Это слово переключает поток на внешнюю память.
Не нашел определения слово WORD у Баранова и Ноздрунова.
В листинге в конце приводится реализация этого слова с применением ассемблера
не существующего вероятно сейчас процессора.
где то в циклах, реализующих слово interpret, должно
вызываться что-нибудь вроде yield, иначе форт система мгновенно сожрет батарейки,
ожидая пользовательских действий
Разрабатывать буду на java, для эффективности,
и ассемблере вирт. машины, из любви к исскусству и
в перспективе получить саморазворачивающуюся систему.
- Код:
: ФОРТ-СИСТЕМА ( ---> )
BEGIN CR ." >" ( ПРИГЛАШЕНИЕ К ВВОДУ)
TIB 80 EXPECT ( ВВЕСТИ ТЕКСТ С ТЕРМИНАЛА)
SPAN @ #TIB ! ( УСТАНОВИТЬ ЕГО ДЛИНУ)
0 TIB #TIB @ + C! ( УСТАНОВИТЬ ОГРАНИЧИТЕЛЬ)
0 >IN ! 0 BLK ! ( УСТАНОВИТЬ ВХОДНОЙ ПОТОК)
INTERPRET ( ИНТЕРПРЕТИРОВАТЬ ВВЕДЕННЫЙ ТЕКСТ)
STATE @ 0= IF ." OK" THEN ( ПОДТВЕРЖДЕНИЕ)
AGAIN ;
- Код:
: LOAD ( N:НОМЕР ---> ИНТЕРПРЕТИРОВАТЬ ЭКРАН)
>IN @ >R BLK @ >R ( СОХРАНИТЬ ТЕКУЩИЙ)
BLK ! 0 >IN ! ( УСТАНОВИТЬ НОВЫЙ)
INTERPRET ( ПРОИНТЕРПРЕТИРОВАТЬ ЕГО)
R> BLK ! R> >IN ! ; ( ВЕРНУТЬСЯ К ПРЕЖНЕМУ)
Это слово переключает поток на внешнюю память.
- Код:
: INTERPRET ( ---> ) BEGIN BL WORD FIND
?DUP IF ( ПРОВЕРИТЬ ПРИЗНАК IMMEDIATE)
1+ IF EXECUTE
ELSE STATE @ IF , ELSE EXECUTE THEN
THEN
ELSE ( МОЖЕТ БЫТЬ ЭТО ЧИСЛО?)
NUMBER DPL @ 1+
IF [COMPILE] 2LITERAL
ELSE DROP [COMPILE] LITERAL THEN
THEN AGAIN ;
В случае если очередное введенное слово не найдено в словаре,
исполняется слово NUMBER, которое пытается воспринять его как запись числа в
соответствии с текущим основанием системы счисления-значением переменной
BASE. Если это удалось, то слово NUMBER возвращает значение числа как
значение двойной длины и дополнительно в переменной DPL сообщает позицию
десятичной точки в нем (-1, если точки в записи числа не было). В противном
случае возникает ошибочная ситуация "Слово не найдено", и интерпретация
прекращается. Если же введенное слово оказалось числом, то в зависимости от
наличия в нем точки оно рассматривается как число двойной или одинарной
точности. Таким образом, пустое слово-ограничитель входного
потока-прекращает исполнение слова INTERPRET и возобновляет исполнение
слова, его вызвавшего:
: X ( ---> ) R> DROP ; IMMEDIATE
Здесь X обозначает пустое слово.
Не нашел определения слово WORD у Баранова и Ноздрунова.
В листинге в конце приводится реализация этого слова с применением ассемблера
не существующего вероятно сейчас процессора.
где то в циклах, реализующих слово interpret, должно
вызываться что-нибудь вроде yield, иначе форт система мгновенно сожрет батарейки,
ожидая пользовательских действий
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Любыми способами, хоть загрузкой с интернета или блютузаGudleifr пишет:Это я понял сразу. Только я так и не понял, как скрипты будут попадать в программу?vikt144 пишет:то хотелось бы получить скриптовый язык хотя бы внутри программы.
1. Будут честно компилироваться в код на компилирующей машине? (Как любят микрофортеры).
2. Будут вводиться путем добавления константных массивов? (Так обычно добавляют шитые слова в ассемблерный код ядра системы).
3. Будут храниться в отдельном файле (блоке данных), читаемом программой при запуске. (Как у меня в WIN-FOBOS).
4. Будут считываться из блоковой памяти? (Как в старых FORTH).
5. Будут вводится с консоли самой программы? (Как в первых главах книжек по FORTH).
Я конечно, традиционном способомGudleifr пишет:
И, да, кто, где и как создает саму программу (без скриптов)?В догонку: кто, где и как создает эти кнопки (дизайн, функционал, привязка к обработчику событий)?vikt144 пишет:В результате получается программа, управляемая одной, двумя, тремя кнопками
Gudleifr пишет:Я не против VM, я просто не понимаю, где она написана, где она запускается, откуда получает команды...vikt144 пишет:Критика виртуальных машин мне непонятна.
processImage( int startIP ) запускает байт код с адреса startIp. Байт код загружен в массив public short [] image;
processImage может запустится при нажатии на кнопку, прикосновению к экрану,
при наступлении какого-нибудь события, например вход в окрестности географической точки,
для которой установлен обработчик, или сработал датчик приближения итд.
Происходит примерно так.
Обработчик кнопки на java получает сообщение о нажатии, если на кропку установлен обработчик на форт скрипт
то код формирует стек, вызывает processImage(ScriptAddr) иначе сам обрабатывает нажатие...
Как то так
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
В 27-м блоке. В кодах только часть собственно выделения слова - ENCLOSE.vikt144 пишет:Не нашел определения слово WORD у Баранова и Ноздрунова.
Вообще, реализуют WORD в виде шитого слова только структурные фортеры. Реализация в кодах гораздо удобнее. У меня есть про WORD целая ветка ТЕМА #45.
Все зависит от того где и как у Вас будет этот цикл. Возможно, он Вам вообще нафиг не нужен.vikt144 пишет:где то в циклах, реализующих слово interpret, должно
вызываться что-нибудь вроде yield
Выберите что-нибудь одно.vikt144 пишет:Любыми способами, хоть загрузкой с интернета или блютуза
Каким из 1001 возможных?vikt144 пишет:Я конечно, традиционном способом
Повторю вопрос:vikt144 пишет:Обработчик кнопки на java получает сообщение о нажатии, если на кропку установлен обработчик на форт скрипт
Кто, где и каким способом нарисовал кнопку (вставил ее рисовалку в программу)?
Кто, где и каким способом засунул туда скрипт (тьфу, уже спрашивал пятью строками выше)?
Кто, где и каким способом привязал вызов этого скрипта к кнопке (ну, ладно, способ - адрес в таблице скриптов, но кто и где)?
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
1) Я конечно.
Повторю вопрос:
Кто, где и каким способом нарисовал кнопку (вставил ее рисовалку в программу)?
Кто, где и каким способом засунул туда скрипт (тьфу, уже спрашивал пятью строками выше)?
Кто, где и каким способом привязал вызов этого скрипта к кнопке (ну, ладно, способ - адрес в таблице скриптов, но кто и где)?
В андроид программирование для этого обычно рисуется иксмл файл,
там описываются кнопки и элементы экрана. Затем в активити этого экрана кнопка иниции-
руется и на нее вешается обработчик. Это делается на этапе создания явы части программы,
2) Я конечно.
Скрипт можно засунуть любым способом, каким можно засунуть в телефон текст.
Это делается уже после компиляции программы на ява, тут реализуются свои хотелки,
автоматизируется работа с программой. На первое время, выбрал простейший вариант -
скрипты на форте будут компилируются при старте программы.
3) Я конечно.
Примерная схема такова. Обработчик (кнопки события итп) проверяет, активирован ли
скрипт, если да, берет из таблицы адрес и вызывает
processImage(ScriptAdress);
В кодах только часть собственно выделения слова - ENCLOSE.
ENCLOSE - это стандартное форт слово, или слово, созданное для реализации стандартного
слова WORD и без него можно обойтись, реализовав WORD другим способом?
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Издеваетесь? Я уже два года Вас пытаю: на какой машине и какими средствами Вы это делаете?vikt144 пишет:Я конечно.
Тот же "иксмл файл"... Вы его делаете на компьютере или на телефоне? В редакторе руками или генерируете программой?
И так - по всему списку проводимых Вами работ.
Это, наоборот, наиболее сложный вариант. Зачем тащить FORTH на телефон, если он работает только один раз - при запуске? Проще прошить FORTH-скрипт на компьютере.vikt144 пишет:На первое время, выбрал простейший вариант - скрипты на форте будут компилируются при старте программы.
ENCLOSE - нестандартное слово. WORD проще делать монолитным, в маш.кодах, особенно на первых порах (когда еще нет обилия подстроечных переменных) и в окончательной форме (когда уже можно выкинуть ненужную подстройку).vikt144 пишет:ENCLOSE - это стандартное форт слово, или слово, созданное для реализации стандартного слова WORD и без него можно обойтись, реализовав WORD другим способом?
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
У себя я когда-то сделал так:
А это способ на основе парсера Черезова:
p.s. Не гарантирую сейчас 100% правильность последнего кода, т.к. выдрал из моих тестовых исходников...
p.p.s. Принцип то простой:
1. Пропустить разделители
2. Выделить строку до разделителя
3. Передать адрес и размер строки подпрограмме
Разве что REFILL опускаю...
- Код:
AWORD WORD_,"(WORD)",0
pop dx,cx,bx ; C, Len, Addr
mov di,bx
@@:
jcxz CONT0
cmp dl,[bx]
je CONTN
inc bx
dec cx
jmp @b
CONTN:
inc bx
dec cx
push bx,cx ; NewAddr, NewLen
push di ; Word
sub bx,di
dec bx
push bx ; WordLen
jmp NEXT
CONT0:
push bx,cx ; NewAddr, NewLen
push di ; Word
sub bx,di
push bx ; WordLen
AEND
FWORD _WORD,"WORD",0
dw _IN,@,SWAP
dw _SZ,@,SWAP
dw WORD_
dw _2SWAP
dw _SZ,!,_IN,!
FEND
А это способ на основе парсера Черезова:
- Код:
: SOURCE ( -- addr n )
SOURCE-ID @ IF TIB @ #TIB @ ELSE BUF @ #BUF @ THEN
;
: EndOfChunk ( -- flag )
>IN @ SOURCE NIP < 0= \ >IN не меньше, чем длина чанка
;
: CharAddr ( -- c-addr )
SOURCE DROP >IN @ +
;
: PeekChar ( -- char )
CharAddr C@
;
: IsDelimiter ( char -- flag )
BL <=
;
: GetChar ( -- char flag )
EndOfChunk
IF 0 FALSE
ELSE PeekChar TRUE THEN
;
: OnDelimiter ( -- flag )
GetChar SWAP IsDelimiter AND
;
: SkipDelimiters ( -- ) \ пропустить пробельные символы
BEGIN
OnDelimiter
WHILE
>IN 1+!
REPEAT
;
: OnNotDelimiter ( -- flag )
GetChar SWAP IsDelimiter 0= AND
;
: SkipWord ( -- ) \ пропустить непробельные символы
BEGIN
OnNotDelimiter
WHILE
>IN 1+!
REPEAT
;
: ParseWord ( -- c-addr u )
CharAddr >IN @
SkipWord
>IN @ SWAP -
;
: NextWord ( -- c-addr u )
SkipDelimiters ParseWord
;
: WORD ( ch -- addr sz )
\ Skip CHs (SkipDelimiters1)
BEGIN
DUP GetChar ( ch ch char flag )
SWAP ROT ( ch flag char ch )
= AND ?BREAK
IN> 1+!
AGAIN
\ Select substring (ParseWord1)
( ch )
CharAddr IN> @ ROT ( addr startoffs ch )
\ SkipWord1
BEGIN ( addr startoffs ch )
DUP GetChar ( ... ch ch char flag )
SWAP ROT ( ... ch flag char ch )
<> AND ?BREAK
IN> 1+!
AGAIN
( addr startoffs ch )
DROP IN> @ SWAP ( addr endoffs startoffs )
- ;
: (') ( -- xt sz_flags \ addr sz false )
NextWord 2DUP FIND IF NIP NIP DUP C@ SWAP NAME> THEN ;
: ' ( -- xt )
(') NOT IF DROP DROP FALSE THEN
;
p.s. Не гарантирую сейчас 100% правильность последнего кода, т.к. выдрал из моих тестовых исходников...
p.p.s. Принцип то простой:
1. Пропустить разделители
2. Выделить строку до разделителя
3. Передать адрес и размер строки подпрограмме
Разве что REFILL опускаю...
_KROL- Сообщения : 93
Дата регистрации : 2017-07-28
Возраст : 24
Откуда : Беларусь
Re: Создание простого транслятора forth
В дополнении нашёл вариант с использованием :> из FORK (mOleg) которое создаёт слова, при исполнении которого кладётся адрес кода.
WOR|DS , где | - граница между "секторами", но только что посмотрел в парсер mOleg-а (отчасти SPF) и понял, что надо просто считывать всю строку
p.s. Простите, что не совсем, наверное, в тему.
- Код:
: SOURCE ( -- addr n )
INPUT @ $INPUT @
;
: EndOfChunk ( -- flag )
>IN @ SOURCE NIP < 0=
;
: CharAddr ( -- addr )
SOURCE DROP >IN @ +
;
: PeekChar ( -- char )
CharAddr C@
;
: GetChar ( -- char flag )
EndOfChunk
IF REFILL EndOfChunk IF C#0 FALSE EXIT THEN THEN
PeekChar TRUE
;
: OnDelimiter ( &delim -- flag )
GetChar R> SWAP EXECUTE R> AND
;
: SkipDelimiters ( &delim -- ) \ пропустить пробельные символы
BEGIN
OnDelimiter
WHILE
>IN 1+!
REPEAT
;
: OnNotDelimiter ( &delim -- flag )
GetChar R> SWAP EXECUTE 0= R> AND
;
: SkipWord ( &delim -- ) \ пропустить непробельные символы
BEGIN
OnNotDelimiter
WHILE
>IN 1+!
REPEAT
;
: ParseWord ( &delim -- addr u )
CharAddr >IN @
SkipWord
>IN @ SWAP -
;
:> delim_std ( c -- flag )
BL U<
;
: NextWord ( -- addr u )
delim_std DUP SkipDelimiters ParseWord
;
:> delim_word ( c2 c1 -- flag )
=
;
: WORD ( ch -- addr sz )
delim_word SWAP 2DUP SkipDelimiters ParseWord
;
WOR|DS , где | - граница между "секторами", но только что посмотрел в парсер mOleg-а (отчасти SPF) и понял, что надо просто считывать всю строку
p.s. Простите, что не совсем, наверное, в тему.
_KROL- Сообщения : 93
Дата регистрации : 2017-07-28
Возраст : 24
Откуда : Беларусь
Re: Создание простого транслятора forth
В общем случае - никак (см. то, что я написал в теме про WORD). Делайте то, что Вам надо и не думайте об универсальности. Случай, когда слово занимает несколько "буферов чтения", вполне теоретически возможен (например, пользователь строку за строкой вводит очень длинный комментарий), но практически почти не встречается (кому нужен этот комментарий, если он, все равно, игнорируется)._KROL пишет:Вот только я всегда хотел понять, как разрешить такую ситуацию: WOR|DS , где | - граница между "секторами"
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Я уже не знаю как объяснять
Издеваетесь? Я уже два года Вас пытаю: на какой машине и какими средствами Вы это делаете?
1)Создается обычная ява программа, например фотопрограмма для андроид.
Любым способом: используя эклипс или иде или текстовый редактор компилируя
в командной строке с помощью команды javac
2) В эту программу также вкомпилирован форт и какой-нибудь способ читать
текстовые файлы.
3) Так же ява программа обрабатывает "порты" в соответствии со своей логикой,
что дает возможность форту использовать ресурсы данной ява программы.
4) Ява программа инсталируется в андроид.
5)Пользователь, (в ланный момент пока только я) создает тексты с форт программой,
(любым способом, набирая тексты на телефоне или копируя с компьютера) в любое
время, после установки ява приложения.
6) Таким образом создается множество форт приложений внутри одного
java приложения
Для фотопрограммы это
Программа калибровки( плавно изменяет разрешение и баланс белого и дома
анализируются полученные файлы)
Сторожевая система, просто делала фотографию раз в несколько секунд,
выявляли урода, который кидает мусор соседки через забор
Самодельное go-pro - непрерывное фотографирование с руля велосипеда
Диктофон
и вообще все, на что хватит фантазии.
Спасибо
ENCLOSE - нестандартное слово. WORD проще делать монолитным, в маш.кодах, особенно на первых порах
Спасибо. Скачал исходники спф, похоже, там много интересного
А это способ на основе парсера Черезова:
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Наконец-то.vikt144 пишет:Я уже не знаю как объяснять
Теперь пытаемся понять, что нам надо.
Забываем пока про FORTH - напрочь.
Что имеем:
1) Есть компьютер и телефон
2) Java-программа пишется на компьютере
3) Интерфейсная часть этой программы (формы-кнопочки) создаются тут же
4) Скомпилированная Java-программа переносится на телефон
5) На телефоне создается текстовый файл с командами для программы
6) Программа запускается на телефоне, считывает файл с командами и продолжает работать
7) Время от времени программа (по какому-либо сигналу) исполняет считанные команды
Я правильно понял?
Что осталось непонятным:
8 ) Для изменения/доввода/перенастройки команд надо перезапускать программу?
Вспоминаем про FORTH.
Мы имеем три "машины" (проходящие цикл, показанный на рисунке Броуди на предыдущей странице):
9) Цикл Java-совершенствования программы. Работает на компьютере, пока целиком вручную. И таким и останется по жизни.
10) Машина считывания FORTH-команд - часть Java-программы, работает при запуске
11) Машина исполнения шитого кода - часть Java-программы, работает по сигналу
В зависимости от ответа на вопрос (8 ) машины (10) и (11) могут либо частично срастись, либо вообще не иметь между собой ничего общего.
Последний раз редактировалось: Gudleifr (Вс Мар 10, 2019 12:18 pm), всего редактировалось 1 раз(а)
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Немного подробнее о машинах (10) и (11). Где там FORTH?
Согласно схеме FORTH:
Очевидно, что машина (11) у Вас уже практически готова. Разве что, еще попричесывать "шитый код" в связи с решением вопроса (8 ).
Согласно схеме FORTH:
FORTH | МАШИНА (10) | МАШИНА (11) |
ОК | Открытие текстового файла, организация циклического чтения из него. | Фиксация в Java-коде событий. |
СИМВОЛ | Чтение слов, поиск их в СЛОВАРЕ, распознавание чисел. | Определение связанных с событиями портов. |
ВЫПОЛНИТЬ | Практически, только компилирующие слова. | Вызов нужного Java-кода. |
КОМПИЛИРОВАТЬ | "Обычным FORTH-образом". | Практически отсутствует. |
СЛЕДУЮЩИЙ | "Обычным FORTH-образом". | Исполнение "шитого" кода. |
Очевидно, что машина (11) у Вас уже практически готова. Разве что, еще попричесывать "шитый код" в связи с решением вопроса (8 ).
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
В принципе, порядок загрузки, компиляции и источника текстов для форт скиптов можно определить
в процессе реализации логики java программы.
можно определить скрипты onstart., onquiet и тому подобное.
В настоящий момент у меня реализована неразвитое подмножество будущей системы.
Код на ява делится на две части,
1) Сервисные ф-ции, доступные как ява-программе, так и форту.
2) Собственно головная часть, которая обеспечивает минимальный функционал,
и запуск форт программ.
Роль форта тут аналогична роли яваскрипт в браузере.
Или что-то вроде plugin , расширяющие функционал основной программы.
в процессе реализации логики java программы.
можно определить скрипты onstart., onquiet и тому подобное.
В настоящий момент у меня реализована неразвитое подмножество будущей системы.
Код на ява делится на две части,
1) Сервисные ф-ции, доступные как ява-программе, так и форту.
2) Собственно головная часть, которая обеспечивает минимальный функционал,
и запуск форт программ.
Роль форта тут аналогична роли яваскрипт в браузере.
Или что-то вроде plugin , расширяющие функционал основной программы.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Давайте уж определите, наконец.vikt144 пишет:В принципе, порядок загрузки, компиляции и источника текстов для форт скиптов можно определить
в процессе реализации логики java программы.
Такое деление само по себе нам ничего не даст.vikt144 пишет:Код на ява делится на две части,
1) Сервисные ф-ции, доступные как ява-программе, так и форту.
2) Собственно головная часть, которая обеспечивает минимальный функционал,
и запуск форт программ.
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Давайте уж определите, наконец.
Ну это только в ходе опытной эксплуатации.
К тому же решения могут отличатся на разных платформах,
кнопочных телефонах, смартфонах, десктопах...
И именно этот вопрос вполне можно отложить на потом.
В данный момент можно считать, что текст есть, и
если BLK не равен 0 \\ не терминал,
то BLK это индекс в векторе, где находится строка с текстом, который
нужно интерпретировать.
( определение вектора дано выше)
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
А что эксплуатировать-то?vikt144 пишет:Ну это только в ходе опытной эксплуатации.
Пока надо решить три вопроса, без которых, мы никак не сдвинемся с мертвой точки
(нумерация из поста от 9-го марта):
Правильно ли я понял пп.1-7 ?
п.8: Для изменения/доввода/перенастройки команд надо перезапускать программу?
С какой машины начинаем: п.10 или п.11?
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
1 - 7 в принципе правильно
8 ) Не обязательно, в процессе разработки Java программы создается логика работы с
forth машинами. Ничего не мешает делать все, что угодно.
Например можно форт машине, через порты, предоставить java функции создания
форт машины, и тогда можно рекурсивно запустить хоть гирлянду форт машин.
После тщательного обдумывания, решил завести дополнительный Vector StringVector,
специально для работы со строками.
и так word, его надо реализовать в кодах - для мобильных устройств, за редким исключением,
это значит, что надо реализовывать на java.
переменные размещаются в "памяти" форт программы, в массиве коротких
целых short
в
short[] image = new short[ memory_size ];
определение временных, (пока словарь не определен) переменных,
которые являются адресами соответствующих переменных в массиве image
значения считаем уже определенными
Вроде все определил, нужное для реализации word.
Можно еще добавить строку из пробела, новой строки и табуляции, в процессе реализации решим.
String blankSimbol =" \n\t";
8 ) Не обязательно, в процессе разработки Java программы создается логика работы с
forth машинами. Ничего не мешает делать все, что угодно.
Например можно форт машине, через порты, предоставить java функции создания
форт машины, и тогда можно рекурсивно запустить хоть гирлянду форт машин.
После тщательного обдумывания, решил завести дополнительный Vector StringVector,
специально для работы со строками.
и так word, его надо реализовать в кодах - для мобильных устройств, за редким исключением,
это значит, что надо реализовывать на java.
переменные размещаются в "памяти" форт программы, в массиве коротких
целых short
в
short[] image = new short[ memory_size ];
определение временных, (пока словарь не определен) переменных,
которые являются адресами соответствующих переменных в массиве image
значения считаем уже определенными
- Код:
public short
BLK , // 0 - терминал индекс в векторе, где находится строка с текстом
_IN, // позиция во входном потоке
TIB,
_TIB, // #TIB
SPAN //кол-во считанных символов
;
Вроде все определил, нужное для реализации word.
Можно еще добавить строку из пробела, новой строки и табуляции, в процессе реализации решим.
String blankSimbol =" \n\t";
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
А что неправильно в частностях?vikt144 пишет: 1 - 7 в принципе правильно
Мешает. Нам надо решить, что делать. Иначе Вы так и будете копаться в этих никому не нужных векторах.vikt144 пишет: 8 ) Не обязательно, в процессе разработки Java программы создается логика работы с
forth машинами. Ничего не мешает делать все, что угодно.
"Ничего не мешает делать все, что угодно"?
В FORH говорят иначе: "Ничего не мешает делать все, что надо" и "Ничего не мешает потом переделать".
Почему важно решить вопрос (8 )? Это решение позволит нам упростить процедуру чтения программы и оптимизировать шитый код программы. Т.е. мы будем использовать FORT по назначению - для решения задачи пользователя методом приближения. А закладывать в программу лишнюю универсальность - значит, делать то, что придется потом переделывать.
WORD еще делать рано.
Вы еще так и не решили, какой из FORTH мы делаем - считывания программы или ее исполнения.
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Я написал электронную таблицу с поддержкой форт скиптов.
В электоронной таблице, форт скрипт можно создать в любой момент, и их там бесконечно.
Следовательно программу перезапускать не нужно.
Я вообще не понимаю, в чем сложность считывать тексты программ.
Да я мечтаю о том, чтоб только такие трудности меня преследовали.
в качестве параметров ф-ции java api?
Итак, переменная blk указывает номер строки в векторе, который надо интерпретировать.
Строка тут utf, содержит также переносы строк.
Как строка туда попала, пока не рассматриваем, оставим на потом.
например, при запуске форт системы интерпретируется 0 блок
вместо терминала можно скормить сценарий загрузки блоков...
все это легко и второстепенно.
В стандартном форте blk указывает на бинарные данные в BLOCK, после считывания и интерпретации
строки, этот блок можно модифицировать. Тут несовместитмость со стандартом.
В электоронной таблице, форт скрипт можно создать в любой момент, и их там бесконечно.
Следовательно программу перезапускать не нужно.
Я вообще не понимаю, в чем сложность считывать тексты программ.
Да я мечтаю о том, чтоб только такие трудности меня преследовали.
- Код:
Иначе Вы так и будете копаться в этих никому не нужных векторах.
в качестве параметров ф-ции java api?
Итак, переменная blk указывает номер строки в векторе, который надо интерпретировать.
Строка тут utf, содержит также переносы строк.
Как строка туда попала, пока не рассматриваем, оставим на потом.
например, при запуске форт системы интерпретируется 0 блок
вместо терминала можно скормить сценарий загрузки блоков...
все это легко и второстепенно.
В стандартном форте blk указывает на бинарные данные в BLOCK, после считывания и интерпретации
строки, этот блок можно модифицировать. Тут несовместитмость со стандартом.
vikt144- Сообщения : 128
Дата регистрации : 2017-03-29
Re: Создание простого транслятора forth
Хорошо. Будем ориентироваться на это. Сращиваем машины.vikt144 пишет:Следовательно программу перезапускать не нужно.
Какая разница? WORD у нас живет в первой машине. Прикладные Java-функции - во второй. От того, что ф-ии будут обмениваться через регистры, локальные переменные, электронную таблицу, или еще как, FORTH не жарко и не холодно.vikt144 пишет:где хранить данные разных типов, которые возвращают и принимают
в качестве параметров ф-ции java api?
Но, раз Вы не хотите прочувствовать, как работает FORTH с самого начала, напишу код "до WORD" сам.
Алгоритм P. (Программа телефона.) Пока ничего не умеет, кроме чтения входного файла по умолчанию.
P1. [Перезапуск.] Отключаем сигналы, вызывающие запуск скриптов. (Мы, ведь, не хотим, чтобы начали выполняться еще не загруженные программы.) Открываем файл с именем из переменной BLK. (Изначально BLK - константа с именем по умолчанию.)
P2. [Первая машина.] Считываем посимвольно файл и выводим его в отладочный вывод телефона. (Что это за "отладочный вывод", придумайте сами).
P3. [Интермеццо.] Закрываем файл. Разрешаем сигналы.
P4. [Вторая машина.] Вылетаем по ошибке. (Вторая машина нас пока не интересует.)
P5. [Повтор.] Переходим к шагу P1. (Пока мы сюда, понятно не попадаем.) []
Перепишите это на Java. Убедитесь, что работает. Обратите внимание, что поддержку курсора и чтение литеры из ПОТОКА мы уже реализовали. В WORD нам уже об этом беспокоиться не придется.
Теперь нам надо заменить цикл чтения литер (Шаг P2) циклом вызовов WORD. Обратите внимание, что последний не может заканчиваться по прочтению "конца файла", т.к. WORD должен дообработать последнее слово.
Алгоритм W. (Чтение слова из ПОТОКА.) Читаем слово, ограниченное литерой РАЗДЕЛИТЕЛЬ или концом ПОТОКА. Возвращает указатель на строку СЛОВО. Если последняя оказывается пустой, это означает, что был достигнут конец файла. (Здесь я реализую смесь слов WORD - для случая РАЗДЕЛИТЕЛЬ=пробел - и PARSE - для остальных случаев.)
W1. [А есть ли что читать?] Очищаем СЛОВО. Если не-конец-файла, читаем-литеру.
W2. [Пропуск пробелов.] Пока не-конец-файла И РАЗДЕЛИТЕЛЬ=пробел И литера=пробельный-символ, читаем-литеру.
W3. [Слово.] Пока не-конец-файла И ((РАЗДЕЛИТЕЛЬ=пробел И литера!=пробельный-символ) ИЛИ (РАЗДЕЛИТЕЛЬ!=пробел И литера!=РАЗДЕЛИТЕЛЬ)), добавляем литеру к СЛОВО и читаем-читеру.
W4. [Тест.] Печатаем СЛОВО в отладочную печать. []
Я привел полные условия оценки текущей литеры. Их, понятно, можно упростить.
Почему я не ввел СТЕК для хранения РАЗДЕЛИТЕЛЬ и СЛОВАРЬ для хранения СЛОВО ? Это мы сделаем потом.
Убедитесь, что WORD работает. Или я где-то наврал? Тогда исправьте.
Gudleifr- Admin
- Сообщения : 3241
Дата регистрации : 2017-03-29
Страница 2 из 4 • 1, 2, 3, 4
Страница 2 из 4
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|