Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс фев 28, 2021 08:15

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

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


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


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

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



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

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


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

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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 598
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
С приоритетом операций будет примерно вот так :
Код:
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 и уже они разгребаются. На вырост, так сказать.


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

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 1367
Благодарил (а): 3 раз.
Поблагодарили: 49 раз.
На сайте решений rosettacode.org нет примерa на Форт по решению задачи разбора арифметического выражения
Arithmetic evaluation

P.S, А, на Github есть и такой ещё проект cc64 is a small-C compiler, written in Forth, targeting the 6502 CPU.


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 598
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Ну вот нарисовал навскидку. На SPF
Код:
: BAD ." Wrong syntax" BYE ;

: (GET) 0 HERE C! HERE 1 H-STDIN READ-FILE 2DROP ;
: SEPARATOR? ( -- flag ) HERE C@ 1- BL U< ;
: GET
  BEGIN
    (GET) SEPARATOR? 0=
  UNTIL
;

VECT (EXPRESSION)
: FACTOR
  HERE C@ 10 DIGIT
  IF
    BEGIN
      (GET) HERE C@ 10 DIGIT
    WHILE
      SWAP 10 * +
    REPEAT
    SEPARATOR? IF GET THEN
  ELSE
    HERE C@ [CHAR] ( - IF BAD THEN
    GET (EXPRESSION)
    HERE C@ [CHAR] ) - IF BAD THEN
    GET
  THEN
;

: TERM
  FACTOR
  BEGIN
    HERE C@ [CHAR] * =
    IF
      ['] *
    ELSE
      HERE C@ [CHAR] / =
      IF
        ['] /
      ELSE
        EXIT
      THEN
    THEN
    >R GET FACTOR R> EXECUTE
  AGAIN
;

: EXPRESSION
  HERE C@ [CHAR] - =
  IF
    GET TERM NEGATE
  ELSE
    HERE C@ [CHAR] + = IF GET THEN
    TERM
  THEN
  BEGIN
    HERE C@ [CHAR] + =
    IF
      ['] +
    ELSE
      HERE C@ [CHAR] - =
      IF
        ['] -
      ELSE
        EXIT
      THEN
    THEN
    >R GET TERM R> EXECUTE
  AGAIN
;
' EXPRESSION TO (EXPRESSION)

: MAIN
  H-STDIN FILE-SIZE NIP NIP 0= IF GET EXPRESSION HERE C@ IF BAD THEN . THEN
;

' NOOP MAINX ! ' MAIN TO <MAIN> S" CalcArithm.Exe" SAVE BYE

Использование простое. Откомпилировать. Получится файл CalcArithm.Exe
Создать какой-нибудь текстовый файл и в него поместить арифметическое выражение.
Например такое:
1 + 2*(3 - 2*(3 - 2)*((2 - 4)*5 - 22/(7 + 2*(3 - 1)) - 1)) + 1
и скормить этот файл программе на стандартный вход
CalcArithm.Exe < text.txt
Программа честно его посчитает и выдаст результат. В данном случае 60

Программа написана в беспеременном стиле. Используется только один байт по адресу HERE
Если на ваш взгляд эта прожка достойна представлять Форт на том сайте, ну так закиньте туда. А если не совсем, то разрешаю ее причесать. Алгоритм синтаксичесого разбора в ней выписан архинаглядно и с поюзанием достоинств Форта. Разбор выворачивает выражение постфиксно и в процессе разбора параллельно по фортовски на стеке считает.

З.Ы. Чуть исправил, чтобы полаконичней было.


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

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


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

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


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

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