Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс дек 17, 2017 10:21

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Сб сен 16, 2017 17:13 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 719
Благодарил (а): 3 раз.
Поблагодарили: 31 раз.
Скомпоновал предварительно материал на основе рускоязычного перевода: Джек Креншоу. Давайте создадим компилятор!
и варианта с иллюстрацией на IForth
В тексте есть ещё не обработанные моменты (дальше можно подпровлять) и лишние места в сравнении и с IForth версией, но воможно и такой вариант пока будет тоже познавательным.
Аддаптациию к особенностям другой Форт-системы не делал ещё.

Вложение:
Креншоу_Iforth.rtf.zip [382.42 Кб]
Скачиваний: 41


P.S. Понимаю, что материал ещё несколько сыроват и требует к себе некоторого внимания для приведения к законченному виду, если это по данной тематике возможно :)
В этой же теме можно делать замечания, правки и обсуждения. Хотя, программируя на Форт, можно обходится и без создания "компиляторов".
Разместил в данном подфоруме т.к. здесь возможно добавлять мне файлы (модераторы могут перенести в подходящее место)
Думаю, что данный материал может демонстрировать часть сильных сторон Форт подхода в учебных целях. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Вс сен 17, 2017 23:07 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 719
Благодарил (а): 3 раз.
Поблагодарили: 31 раз.
Встретился такой вариант небольшой реализации (по классике)
по вычислению скобочного выражения.



За это сообщение автора KPG поблагодарил: vikt
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Чт сен 21, 2017 12:10 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 403
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Раз пошёл такой разговор
Однако, нет приоритета операций.


Вложения:
short-mat.f [1.19 Кб]
Скачиваний: 136

_________________
Цель: написать форт-систему
Подцель: pe-формат, отладка, инициализация, словарь
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Пн сен 25, 2017 09:11 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 491
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 20 раз.
С приоритетом операций будет примерно вот так :
Код:
REQUIRE CASE    lib\ext\case.f
REQUIRE /STRING lib\include\string.f

\ Синтаксические символы :
0 CONSTANT null   \ неизвестный символ
1 CONSTANT plus
2 CONSTANT minus
3 CONSTANT star
4 CONSTANT slash
5 CONSTANT lparen
6 CONSTANT rparen
7 CONSTANT number
8 CONSTANT eot    \ конец входного потока или нулевая литера в нем

VARIABLE  STREAM \ указатель на текущую литеру входного потока
VARIABLE #STREAM \ число неразобранных литер во входном потоке
VARIABLE ch      \ прочитанная из входного потока литера
VARIABLE sym     \ прочитанный из входного потока синтаксический символ
VARIABLE val     \ прочитанное из входного потока число

: Error
  ( n --)
  CASE
    0 OF ." Too big number" ENDOF
    1 OF ." ) expected"     ENDOF
    2 OF ." Wrong syntax"   ENDOF
  ENDCASE
  CR BYE
;

: Read \ чтение литеры из входного потока
  #STREAM @ DUP IF 1- #STREAM ! STREAM @ C@ STREAM 1+! THEN ch !
;

: Number \ извлечение из входного потока числа val
  ( n -- )
  val !
  BEGIN
    Read ch C@
    10 DIGIT
  WHILE
    0 val @ 10 UM* D+ IF 0 Error THEN val !
  REPEAT
;
: Get \ чтение синтаксического символа из входного потока
  BEGIN
    ch C@ 1- BL U<
  WHILE
    Read
  REPEAT
  ch C@
  CASE
    0 OF eot ENDOF
    [CHAR] + OF Read plus   ENDOF
    [CHAR] - OF Read minus  ENDOF
    [CHAR] * OF Read star   ENDOF
    [CHAR] / OF Read slash  ENDOF
    [CHAR] ( OF Read lparen ENDOF
    [CHAR] ) OF Read rparen ENDOF
    10 DIGIT TRUE OF Number number ENDOF
    null SWAP
  ENDCASE
  sym !
;

VECT @выражение

: множитель
  sym @
  CASE
    number OF val @ Get ENDOF
    lparen OF Get @выражение sym @ rparen - IF 1 Error THEN Get ENDOF
    2 Error
  ENDCASE
;

: слагаемое
  множитель
  BEGIN
    sym @
    CASE
      star  OF Get множитель * ENDOF
      slash OF Get множитель / ENDOF
      DROP EXIT
    ENDCASE
  AGAIN
;

: выражение
  sym @
  CASE
    plus  OF Get слагаемое        ENDOF
    minus OF Get слагаемое NEGATE ENDOF
    DROP слагаемое 0
  ENDCASE
  BEGIN
    sym @
    CASE
      plus  OF Get слагаемое + ENDOF
      minus OF Get слагаемое - ENDOF
      DROP EXIT
    ENDCASE
  AGAIN
;
' выражение TO @выражение

: CALCULATE
  SOURCE >IN @ /STRING #STREAM ! STREAM !
  Read Get выражение
  sym @ eot - IF 2 Error THEN . CR
  [COMPILE] \
;

CALCULATE 7 + 3 * (5 - 1) / 2
CALCULATE -7 + 3 * (5 - 1) / 2

BYE
Тут инфиксное выражение выворачивается постфиксным и сразу фортовскими операциями + - * / NEGATE считается.
Тут можно сделать конечно проще, но я сохранил логику компилятора - входной поток литер ch преобразуется в поток синтаксических сущностей (символов) sym и уже они разгребаются. На вырост, так сказать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

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


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

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


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

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