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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Креншоу, Давайте создадим компилятор (на Форт :)
Автор Сообщение
  Заголовок сообщения:  Re: Креншоу, Давайте создадим компилятор (на Форт :)  Ответить с цитатой
С приоритетом операций будет примерно вот так :
Код:
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 и уже они разгребаются. На вырост, так сказать.
Сообщение Добавлено: Пн сен 25, 2017 09:11
  Заголовок сообщения:  Re: Креншоу, Давайте создадим компилятор (на Форт :)  Ответить с цитатой
Раз пошёл такой разговор
Однако, нет приоритета операций.


Вложения:
short-mat.f [1.19 Кб]
Скачиваний: 377
Сообщение Добавлено: Чт сен 21, 2017 12:10
  Заголовок сообщения:  Re: Креншоу, Давайте создадим компилятор (на Форт :)  Ответить с цитатой
Встретился такой вариант небольшой реализации (по классике)
по вычислению скобочного выражения.
Сообщение Добавлено: Вс сен 17, 2017 23:07
  Заголовок сообщения:  Креншоу, Давайте создадим компилятор (на Форт :)  Ответить с цитатой
Скомпоновал предварительно материал на основе рускоязычного перевода: Джек Креншоу. Давайте создадим компилятор!
и варианта с иллюстрацией на IForth
В тексте есть ещё не обработанные моменты (дальше можно подпровлять) и лишние места в сравнении и с IForth версией, но воможно и такой вариант пока будет тоже познавательным.
Аддаптациию к особенностям другой Форт-системы не делал ещё.

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


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

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


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