Це переформулювання програми граматики? попередній запитував Ваг і з багатьма пропозиціями від коментаторів.
Яким чином граматика може розглядатися як зазначена модель обчислення? Якщо, наприклад, ми візьмемо просту без контексту граматику, таку як
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
Якщо припустити, що аналізатор не розмежовує термінальні та нетермінальні символи, як я продемонстрував тут, то можна виконати просту арифметику для чисел до 3.
Наприклад, візьміть рядок
"2 + 0 + 1"
Запуск аналізатора LR (1) для цього рядка повинен дати нам таке конкретне дерево синтаксису, де результат обчислення зберігається в корені дерева:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Таким чином, якщо ми візьмемо граматику як програму, а генератор парсера - компілятор , чи можемо ми розглянути мову специфікації граматики як мову програмування ?
Крім того, чи могли б ми створити програми, повністю завершені Тьюрінгом, вказавши граматики, подібні до того, як ви могли б створювати цілісні програми за допомогою клітинних автоматів або обчислення лямбда ?
Іншими словами, відомо, що в сенсі розпізнавання мови звичайні мови відповідають автоматам з кінцевим станом , без контекстних мов відповідають автоматизовані автомати , а контекстно-чутливі мови відповідають лінійним обмеженим автоматам . Однак якщо ми розглянемо граматику як обчислювальні пристрої (тобто програми у значенні наведеного вище прикладу), то як можна класифікувати обчислювальну силу кожного класу граматик в ієрархії Хомського?
- Регулярні граматики
- Граматики без контексту
- Контекстно-чутливі граматики
- Неограничені граматики (для рекурсивно перелічених мов )
Крім того, як щодо менш відомих підкласів граматик, таких як
- Детерміновані без контексту граматики (також LR (k) / LL (k) / SLR / LALR тощо)
- Вкладені граматики слова
- Дерево, що прилягає до граматики
- Індексовані граматики
EDIT: До речі, це власне запитання в моєму власному запитанні, але я не згадував, що не давав жодного початкового символу для прикладу граматики і махав рукою при необхідності розрізняти термінали і нетермінали. Технічно чи традиційно, я думаю, граматику, мабуть, треба було б написати в більш складному вигляді, як цей (де S - вихідний символ, а $ - термінал кінця потоку):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... не те, що насправді щось змінює, але я подумав, що слід це згадати.
EDIT: Ще щось, що мені прийшло в голову, коли я читав відповідь Gasche, - це те, що кожна гілка дерева в моєму прикладі являє собою підрахунок. Якщо розглядати кожне правило виробництва як функцію, де LHS представляє результат, а RHS представляє його аргументи, то структура граматики визначає, як складаються функції.
Іншими словами, контекст аналізатора разом з механізмом його пошуку допомагає визначити не тільки функції, які слід застосувати (подібні до параметричного поліморфізму), але і як вони повинні бути складені разом для формування нових функцій.
Принаймні, я здогадуюсь, ви могли б поглянути на це так однозначно CFG, що стосується інших граматик, то розумова гімнастика зараз для мене трохи занадто.