Чому гнучкість Форта робить граматику невідповідною для неї?


10

Нещодавно я взяв на себе завдання написання мови програмування на основі стека. Перш ніж я почав розробляти свою мову, я подумав, що було б хорошою ідеєю читати та експериментувати з існуючими мовами на основі стека.

Це підводить мене до теми цієї публікації. Я читав статтю у Вікіпедії про Forth , мовою на основі стека, яка використовує вирази стилю postfix. У статті я побачив таке твердження:

Гнучкість Forth робить статичну граматику BNF недоцільною, і вона не має монолітного компілятора. Розширення компілятора вимагає написання нового слова замість зміни граматики та зміни базової реалізації.

З мого розуміння, у Forth lingo термін "слово" здається в основному синонімом "підпрограми". З огляду на це, наведене твердження видається дивним. Чому саме можливість створення нових функцій у Forth зробить формальну граматику для Forth недоцільною? Чому вам потрібно переписати граматику для кожної нової визначеної підпрограми? Як написання нового слова в середовищі означає розширення компілятора? Вищенаведене твердження здається схожим на те, що формальна граматика не підходить для Python, оскільки ви можете визначати нові функції.

Насправді я вирішив спробувати написати граматику стилю BNF для простої підмножини Forth нижче:

program        ::= stmt+
stmt           ::= func | expr
func           ::= ':' expr+ ';'
expr           ::= INTEGER | word
word           ::= ('+' | '-' | '*' | '/' )

Вищенаведена граматика, здається, охоплює дійсну підмножину тверджень Forth, і не здається, що важко розширити, щоб охопити всі дійсні висловлювання на мові Forth. Крім того, якщо аналізатор компілятора реалізує вищевказану граматику, я не бачу, як компілятор коли-небудь буде розширений. Компілятор просто додасть будь-які нові слова до свого оточення . Змінюється лише середовище. Це майже здається, ніби вищевказаний уривок з Вікіпедії суперечить підкреслюваному коду, який складається з компілятора (який не змінюється) із середовищем компілятора (який дійсно змінюється).

Підсумовуючи це, чому абліті Форта щодо визначення нових слів (підпрограм) роблять невідповідними для писемної граматики?


1
"Невідповідне" - сильне слово в цьому контексті. Краще слово було б, напевно, "непотрібним".
Роберт Харві

1
О, добре @RobertHarvery. Однак якби це було так, то, здавалося б, уривок, який я цитував, здавалося б, стосується більшості мов. Технічно граматика ніколи не потрібна , але приємно мати її - особливо, коли пишуть парсери.
Крістіан Дін

Але в більшості мов аналізатор - це не проста бібліотека часу виконання, яку можна змінити за допомогою коду користувача, тим самим впливаючи на аналіз наступного рядка.
Йорг W Міттаг

Відповіді:


10

"Нормальне" слово - це майже просто підпрограма.

... але ви можете написати визначене користувачем слово , яке змінить спосіб роботи компілятора. Наприклад, визначення зазвичай починається двокрапкою (":") і закінчується крапкою з комою (";"). Але якщо ви хочете, ви можете (наприклад) змінити те, що робить двокрапка, і в процесі змінити, як визначення слова "складено", тим самим змінивши, як працює компілятор, і змінити граматику розпізнаваної мови.

Ось чому сказати граматику недоцільно - граматика може буквально змінюватися з однієї частини програми в іншу. Завантаження словника може змінити не тільки підпрограми, імена яких зараз розпізнаються, але й граматику, яка розбирається під час визначення нового слова.


2
Ви впевнені, що ця властивість Форта дійсно змінює граматику, а не лише семантику?
Док Браун

@DocBrown: Більшість людей, які використовують Forth, подобається досить багато, тому вони зазвичай вносять лише найменші зміни, необхідні для виконання завдання. Хтось досить амбітний (і божевільний) міг повністю змінити синтаксис, якщо хотів - як, наприклад, використовувати позначення інфіксації замість постфікса, якщо вони хотіли б погано.
Джеррі Труну

@DocBrown Яку граматику ви могли б написати, що дозволило б мені написати перекладача C у Forth, а потім раптом перейти на C посеред програми?
користувач253751

@immibis: ну, моє запитання - чи дійсно Форт дозволяє щось подібне? З цієї пов'язаної статті мені це не властиво.
Док Браун

@DocBrown Так, це так. Ви можете запустити свій код під час компіляції, це означає, що якщо ви хочете, ви можете повністю взяти на себе компілятор. В основному ви можете запустити свій компілятор / перекладач C посеред компілятора / перекладача Forth. (чи хочете ви врешті повернутися до Forth чи ні, вирішувати вам)
користувач253751

3

У Forth ви можете запустити код під час компіляції.

Зокрема, ви можете запустити код, який споживає слова з введення. Наприклад, ви можете написати компілятор C у Forth, а потім викликати його під час компіляції, а потім написати іншу частину програми в C.

Більш часто ви можете визначити слова, які читають аргументи з вихідного коду. Традиційно ви читаєте слова так само, як і компілятор, але це не потрібно.

Наприклад, ."слово (яке друкує рядок) не читається до наступного пробілу, воно читається до наступного ". Якщо ви спробуєте розібрати код : PRINTHELLO ." Hello ; : func2 world!" ;без спеціального випадку .", ви виявите, що він неправильно проаналізований.

Ви , звичайно , можете додати спеціальний випадок для ."до вашої граматики, але граматика все одно буде невірною , якщо програміст визначає своє власне слово , як ."- наприклад , ось один: : MY_PRINT POSTPONE ." ; IMMEDIATE. Це слово рівнозначне ."; Я можу писати, MY_PRINT Hello ; world! "і ваша граматика повинна вміти її розбирати. Удачі в цьому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.