KRIEGSSPIELE!
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Создание простого транслятора forth

Участников: 3

Страница 2 из 4 Предыдущий  1, 2, 3, 4  Следующий

Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Мар 01, 2019 1:30 am

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

Код:

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

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Пт Мар 01, 2019 12:13 pm

vikt144 пишет:Непонятно, с чего начинать, с каких-нибудь сервисных функций, или с чего-то еще.

Выше в этой теме:
Gudleifr пишет:char s[256]; main() { while(1) gets(s); }
Gudleifr пишет:начинать надо не с осмысления всего взаимодействия системы в целом, а тупо с рисовании на бумажке приведенного выше рисунка с указанием, что, с чем, какими средствами и на какой машине я НА ДАННЫЙ МОМЕНТ делаю. Затем - добавлять и удалять к этому рисунку петли для приближения к ИДЕАЛУ.

Вы же сами написали:
vikt144 пишет:Но это более менее интегрируется со старым, работающим кодом.
Опишите формально машину, в которую "все это интегрируется".

Возможно, тут Важно понять, как появился FORTH. Расхожая байка микрофортеров - "FORTH разработан для управления телескопом" - не имеет никакого отношения к реальности. Мур пишет, что проблема была не в "телескопе", а в том, что было лень перфорировать и компилировать программу заново при каждом новом изменении данных. Поэтому он задумался о вынесении "изменяемых данных" на отдельные перфокарты, не трогая "основной программы". Постепенно он понял, что "язык данных" должен быть достаточно сложным, чтобы можно было не просто "подставлять данные", но и "комбинировать операции". Но, при этом, с каждым шагом "основная программа" все более сокращалась и вырождалась в набор "специфических операций с железом" (как у Вас). Использовав FORTH-машину Дейкстры, Мур смог устранить противоречие между желанием "уменьшить изменяемую часть" и возможностью "все описать в изменяемой части".

Поэтому, прежде чем решить, с чего начать, Вы должны нарисовать на бумажке схему взаимодействия "частей" и "машин".
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Мар 01, 2019 9:41 pm

Gudleifr пишет:
Опишите формально машину, в которую "все это интегрируется".
Android от 2,7 и старше версий.
J2me (старые мобильные телефоны с ява)

Программируются исключительно на java.
Андроид имеет нативные методы, то есть с ограничениями предусмотрен си и асм,
но это не кроссплатформенно, поэтому не интересно.


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

Для многозадачности, ее надо серьезно модифицировать, но на это нет времени,
так как навигационная программа мне нужна уже в марте.
Проблемы многозадачности решаются кодом на java.


Gudleifr пишет:
Поэтому, прежде чем решить, с чего начать, Вы должны нарисовать на бумажке схему взаимодействия "частей" и "машин"

Код виртуальной машины здесь вызывается -
Код:

 processImage( int startIP ) // startIP - это адрес в виртуальной машине, с которого начинается исполнение программы.
(можно придумать название процедуры покрасивше)

вызов процедур на java из ВМ
Код:

 out - запись в порт , тут вызывает фцию  callService(int x, int y)
 in  - чтение порта, тут тоже вызывает какую-нибудь ф-цию
 wait - вызывает  handleDevices()
Так же процедуры на java вызываются при обработки ошибок и прочего такого типа.


vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Пт Мар 01, 2019 11:09 pm

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 и я не понимаю, что и как Вы делаете/хотите.

vikt144 пишет:Программируются исключительно на java.
Я java не знаю. Надеюсь, Вы знаете его настолько хорошо, чтобы быть способным на Создание простого транслятора forth - Страница 2 Leaf10ТЕМА #43Создание простого транслятора forth - Страница 2 Leaf10 .

P.S. Если Вы считаете, что мои ответы/советы мешают восприятию темы и не по делу, пишите, удалю/сокращу...


Последний раз редактировалось: Gudleifr (Пн Дек 09, 2019 11:40 am), всего редактировалось 1 раз(а)
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Сб Мар 02, 2019 12:26 am

Код:

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

Код:

 Есть 1001 способ писать на java под Android и +100500 способов прицепить туда FORTH и я не понимаю, что и как Вы делаете/хотите.
Поскольку, в отличие от unix систем, реализовать такую удобную и приятную вещь, как bash
затруднительно, то хотелось бы получить скриптовый язык хотя бы внутри программы.

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

Критика виртуальных машин мне непонятна.
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

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Сб Мар 02, 2019 1:57 am

vikt144 пишет:На java, это значит только на java
Я не говорю, что java - это хорошо или плохо, я напираю на то, что Вы должны его знать на уровне, позволяющем исполнить указанные выше трюки.

vikt144 пишет:то хотелось бы получить скриптовый язык хотя бы внутри программы.
Это я понял сразу. Только я так и не понял, как скрипты будут попадать в программу?
1. Будут честно компилироваться в код на компилирующей машине? (Как любят микрофортеры).
2. Будут вводиться путем добавления константных массивов? (Так обычно добавляют шитые слова в ассемблерный код ядра системы).
3. Будут храниться в отдельном файле (блоке данных), читаемом программой при запуске? (Как у меня в  WIN-FOBOS).
4. Будут считываться из блоковой памяти? (Как в старых FORTH).
5. Будут вводится с консоли самой программы? (Как в первых главах книжек по FORTH).

И, да, кто, где и как создает саму программу (без скриптов)?    

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

vikt144 пишет:Критика виртуальных машин мне непонятна.
Я не против VM, я просто не понимаю, где она написана, где она запускается, откуда получает команды...


Последний раз редактировалось: Gudleifr (Пн Дек 09, 2019 11:42 am), всего редактировалось 1 раз(а)
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Сб Мар 02, 2019 2:23 am

Делаю по Баранову и Ноздрунову.
Разрабатывать буду на 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 обозначает пустое слово.
X - исполняется, если поток исчерпан

Не нашел определения слово WORD у Баранова и Ноздрунова.
В листинге в конце приводится реализация этого слова с применением ассемблера
не существующего вероятно сейчас процессора.

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

vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Сб Мар 02, 2019 3:00 am

Gudleifr пишет:
vikt144 пишет:то хотелось бы получить скриптовый язык хотя бы внутри программы.
Это я понял сразу. Только я так и не понял, как скрипты будут попадать в программу?
1. Будут честно компилироваться в код на компилирующей машине? (Как любят микрофортеры).
2. Будут вводиться путем добавления константных массивов? (Так обычно добавляют шитые слова в ассемблерный код ядра системы).
3. Будут храниться в отдельном файле (блоке данных), читаемом программой при запуске. (Как у меня в  WIN-FOBOS).
4. Будут считываться из блоковой памяти? (Как в старых FORTH).
5. Будут вводится с консоли самой программы? (Как в первых главах книжек по FORTH).
Любыми способами, хоть загрузкой с интернета или блютуза

Gudleifr пишет:
И, да, кто, где и как создает саму программу (без скриптов)?    

vikt144 пишет:В результате получается программа, управляемая одной, двумя, тремя кнопками
В догонку: кто, где и как создает эти кнопки (дизайн, функционал, привязка к обработчику событий)?
Я конечно, традиционном способом

Gudleifr пишет:
vikt144 пишет:Критика виртуальных машин мне непонятна.
Я не против VM, я просто не понимаю, где она написана, где она запускается, откуда получает команды...

processImage( int startIP ) запускает байт код с адреса startIp. Байт код загружен в массив public short [] image;

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

Происходит примерно так.
Обработчик кнопки на java получает сообщение о нажатии, если на кропку установлен обработчик на форт скрипт
то код формирует стек, вызывает processImage(ScriptAddr) иначе сам обрабатывает нажатие...
Как то так

vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Сб Мар 02, 2019 11:04 am

vikt144 пишет:Не нашел определения слово WORD у Баранова и Ноздрунова.
В 27-м блоке. В кодах только часть собственно выделения слова - ENCLOSE.
Вообще, реализуют WORD в виде шитого слова только структурные фортеры. Реализация в кодах гораздо удобнее. У меня есть про WORD целая ветка Создание простого транслятора forth - Страница 2 Leaf10ТЕМА #45Создание простого транслятора forth - Страница 2 Leaf10.

vikt144 пишет:где то в циклах, реализующих слово interpret, должно
вызываться что-нибудь вроде yield
Все зависит от того где и как у Вас будет этот цикл. Возможно, он Вам вообще нафиг не нужен.

vikt144 пишет:Любыми способами, хоть загрузкой с интернета или блютуза
Выберите что-нибудь одно.

vikt144 пишет:Я конечно, традиционном способом
Каким из 1001 возможных?

vikt144 пишет:Обработчик кнопки на java получает сообщение о нажатии, если на кропку установлен обработчик на форт скрипт
Повторю вопрос:
Кто, где и каким способом нарисовал кнопку (вставил ее рисовалку в программу)?
Кто, где и каким способом засунул туда скрипт (тьфу, уже спрашивал пятью строками выше)?
Кто, где и каким способом привязал вызов этого скрипта к кнопке (ну, ладно, способ - адрес в таблице скриптов, но кто и где)?
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вт Мар 05, 2019 10:52 pm


Повторю вопрос:
Кто, где и каким способом нарисовал кнопку (вставил ее рисовалку в программу)?
Кто, где и каким способом засунул туда скрипт (тьфу, уже спрашивал пятью строками выше)?
Кто, где и каким способом привязал вызов этого скрипта к кнопке (ну, ладно, способ - адрес в таблице скриптов, но кто и где)?
1) Я конечно.
В андроид программирование для этого обычно рисуется иксмл файл,
там описываются кнопки и элементы экрана. Затем в активити этого экрана кнопка иниции-
руется и на нее вешается обработчик. Это делается на этапе создания явы части программы,

2) Я конечно.
Скрипт можно засунуть любым способом, каким можно засунуть в телефон текст.
Это делается уже после компиляции программы на ява, тут реализуются свои хотелки,
автоматизируется работа с программой. На первое время, выбрал простейший вариант -
скрипты на форте будут компилируются при старте программы.
3) Я конечно.
Примерная схема такова. Обработчик (кнопки события итп) проверяет, активирован ли
скрипт, если да, берет из таблицы адрес и вызывает
processImage(ScriptAdress);

В кодах только часть собственно выделения слова - ENCLOSE.

ENCLOSE - это стандартное форт слово, или слово, созданное для реализации стандартного
слова WORD и без него можно обойтись, реализовав WORD другим способом?


vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вт Мар 05, 2019 11:20 pm

vikt144 пишет:Я конечно.
Издеваетесь? Я уже два года Вас пытаю: на какой машине и какими средствами Вы это делаете?
Тот же "иксмл файл"... Вы его делаете на компьютере или на телефоне? В редакторе руками или генерируете программой?
И так - по всему списку проводимых Вами работ.

vikt144 пишет:На первое время, выбрал простейший вариант - скрипты на форте будут компилируются при старте программы.
Это, наоборот, наиболее сложный вариант. Зачем тащить FORTH на телефон, если он работает только один раз - при запуске? Проще прошить FORTH-скрипт на компьютере.

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

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор _KROL Ср Мар 06, 2019 10:04 am

У себя я когда-то сделал так:
Код:
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
Был ещё где-то вариант на форте, но я его пока не нашёл Smile

А это способ на основе парсера Черезова:
Код:
: 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
Откуда : Беларусь

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор _KROL Ср Мар 06, 2019 10:10 am

В дополнении нашёл вариант с использованием :> из FORK (mOleg) которое создаёт слова, при исполнении которого кладётся адрес кода.
Код:
: 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) и понял, что надо просто считывать всю строку Rolling Eyes
p.s. Простите, что не совсем, наверное, в тему.

_KROL

Сообщения : 93
Дата регистрации : 2017-07-28
Возраст : 24
Откуда : Беларусь

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Ср Мар 06, 2019 10:20 am

_KROL пишет:Вот только я всегда хотел понять, как разрешить такую ситуацию: WOR|DS , где | - граница между "секторами"
В общем случае - никак (см. то, что я написал в теме про WORD). Делайте то, что Вам надо и не думайте об универсальности. Случай, когда слово занимает несколько "буферов чтения", вполне теоретически возможен (например, пользователь строку за строкой вводит очень длинный комментарий), но практически почти не встречается (кому нужен этот комментарий, если он, все равно, игнорируется).
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пт Мар 08, 2019 9:32 pm


Издеваетесь? Я уже два года Вас пытаю: на какой машине и какими средствами Вы это делаете?
Я уже не знаю как объяснять

1)Создается обычная ява программа, например фотопрограмма для андроид.
Любым способом: используя эклипс или иде или текстовый редактор компилируя
в командной строке с помощью команды javac
2) В эту программу также вкомпилирован форт и какой-нибудь способ читать
текстовые файлы.
3) Так же ява программа обрабатывает "порты" в соответствии со своей логикой,
что дает возможность форту использовать ресурсы данной ява программы.
4) Ява программа инсталируется в андроид.
5)Пользователь, (в ланный момент пока только я) создает тексты с форт программой,
(любым способом, набирая тексты на телефоне или копируя с компьютера) в любое
время, после установки ява приложения.
6) Таким образом создается множество форт приложений внутри одного
java приложения
Для фотопрограммы это
Программа калибровки( плавно изменяет разрешение и баланс белого и дома
анализируются полученные файлы)
Сторожевая система, просто делала фотографию раз в несколько секунд,
выявляли урода, который кидает мусор соседки через забор
Самодельное go-pro - непрерывное фотографирование с руля велосипеда
Диктофон
и вообще все, на что хватит фантазии.


ENCLOSE - нестандартное слово. WORD проще делать монолитным, в маш.кодах, особенно на первых порах
Спасибо


А это способ на основе парсера Черезова:
Спасибо. Скачал исходники спф, похоже, там много интересного


vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Сб Мар 09, 2019 10:27 am

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
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вс Мар 10, 2019 11:32 am

Немного подробнее о машинах (10) и (11). Где там FORTH?

Согласно схеме FORTH:

Создание простого транслятора forth - Страница 2 G9110

FORTHМАШИНА (10)МАШИНА (11)
ОКОткрытие текстового файла, организация циклического чтения из него.Фиксация в Java-коде событий.
СИМВОЛЧтение слов, поиск их в СЛОВАРЕ, распознавание чисел.Определение связанных с событиями портов.
ВЫПОЛНИТЬПрактически, только компилирующие слова.Вызов нужного Java-кода.
КОМПИЛИРОВАТЬ"Обычным FORTH-образом".Практически отсутствует.
СЛЕДУЮЩИЙ"Обычным FORTH-образом".Исполнение "шитого" кода.

Очевидно, что машина (11) у Вас уже практически готова. Разве что, еще попричесывать "шитый код" в связи с решением вопроса (8 ).
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пн Мар 11, 2019 1:18 am

В принципе, порядок загрузки, компиляции и источника текстов для форт скиптов можно определить
в процессе реализации логики java программы.
можно определить скрипты onstart., onquiet и тому подобное.

В настоящий момент у меня реализована неразвитое подмножество будущей системы.


Код на ява делится на две части,
1) Сервисные ф-ции, доступные как ява-программе, так и форту.
2) Собственно головная часть, которая обеспечивает минимальный функционал,
и запуск форт программ.
Роль форта тут аналогична роли яваскрипт в браузере.
Или что-то вроде plugin , расширяющие функционал основной программы.

vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Пн Мар 11, 2019 1:22 am

vikt144 пишет:В принципе, порядок загрузки, компиляции и источника текстов для форт скиптов  можно определить
в процессе реализации логики java  программы.
Давайте уж определите, наконец.

vikt144 пишет:Код на ява делится на две части,
1) Сервисные ф-ции, доступные как ява-программе, так и форту.
2) Собственно головная часть, которая обеспечивает минимальный функционал,
и запуск форт программ.
Такое деление само по себе нам ничего не даст.
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Пн Мар 11, 2019 1:41 am

Давайте уж определите, наконец.

Ну это только в ходе опытной эксплуатации.
К тому же решения могут отличатся на разных платформах,
кнопочных телефонах, смартфонах, десктопах...
И именно этот вопрос вполне можно отложить на потом.

В данный момент можно считать, что текст есть, и

если BLK не равен 0 \\ не терминал,
то BLK это индекс в векторе, где находится строка с текстом, который
нужно интерпретировать.
( определение вектора дано выше)


vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Пн Мар 11, 2019 1:52 am

vikt144 пишет:Ну это только в ходе опытной эксплуатации.
А что эксплуатировать-то?

Пока надо решить три вопроса, без которых, мы никак не сдвинемся с мертвой точки
(нумерация из поста от 9-го марта):

Правильно ли я понял пп.1-7 ?
п.8: Для изменения/доввода/перенастройки команд надо перезапускать программу?
С какой машины начинаем: п.10 или п.11?
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вт Мар 12, 2019 1:00 am

1 - 7 в принципе правильно
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

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вт Мар 12, 2019 1:12 am

vikt144 пишет: 1 - 7 в принципе правильно
А что неправильно в частностях?

vikt144 пишет: 8 ) Не обязательно, в процессе разработки Java программы создается логика работы с
forth машинами. Ничего не мешает делать все, что угодно.
Мешает. Нам надо решить, что делать. Иначе Вы так и будете копаться в этих никому не нужных векторах.

"Ничего не мешает делать все, что угодно"?
В FORH говорят иначе: "Ничего не мешает делать все, что надо" и "Ничего не мешает потом переделать".

Почему важно решить вопрос (8 )? Это решение позволит нам упростить процедуру чтения программы и оптимизировать шитый код программы. Т.е. мы будем использовать FORT по назначению - для решения задачи пользователя методом приближения. А закладывать в программу лишнюю универсальность - значит, делать то, что придется потом переделывать.

WORD еще делать рано.

Вы еще так и не решили, какой из FORTH мы делаем - считывания программы или ее исполнения.
Gudleifr
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор vikt144 Вт Мар 12, 2019 2:00 pm

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

Код:
 Иначе Вы так и будете копаться в этих никому не нужных векторах.
Ваши предложения, где хранить данные разных типов, которые возвращают и принимают
в качестве параметров ф-ции java api?

Итак, переменная blk указывает номер строки в векторе, который надо интерпретировать.
Строка тут utf, содержит также переносы строк.
Как строка туда попала, пока не рассматриваем, оставим на потом.

например, при запуске форт системы интерпретируется 0 блок
вместо терминала можно скормить сценарий загрузки блоков...
все это легко и второстепенно.


В стандартном форте blk указывает на бинарные данные в BLOCK, после считывания и интерпретации
строки, этот блок можно модифицировать. Тут несовместитмость со стандартом.

vikt144

Сообщения : 128
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Создание простого транслятора forth - Страница 2 Empty Re: Создание простого транслятора forth

Сообщение автор Gudleifr Вт Мар 12, 2019 3:17 pm

vikt144 пишет:Следовательно программу перезапускать не нужно.
Хорошо. Будем ориентироваться на это. Сращиваем машины.
vikt144 пишет:где хранить данные разных типов, которые возвращают и принимают
в качестве параметров ф-ции java api?
Какая разница? WORD у нас живет в первой машине. Прикладные Java-функции - во второй. От того, что ф-ии будут обмениваться через регистры, локальные переменные, электронную таблицу, или еще как, FORTH не жарко и не холодно.

Но, раз Вы не хотите прочувствовать, как работает 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
Gudleifr
Admin

Сообщения : 3241
Дата регистрации : 2017-03-29

Вернуться к началу Перейти вниз

Страница 2 из 4 Предыдущий  1, 2, 3, 4  Следующий

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения