Это переформулировка программ грамматики? предыдущий вопрос от Vag и множество предложений от комментаторов.
Каким образом грамматика может рассматриваться как спецификация модели вычислений? Если, например, мы берем простую контекстно-свободную грамматику, такую как
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 и т. Д.)
- Вложенные грамматики слова
- Примыкающие к дереву грамматики
- Индексированные грамматики
РЕДАКТИРОВАТЬ: Между прочим, это мой клеветник по моему собственному вопросу, но я не упомянул, что я не дал начальный символ для примера грамматики и помахал рукой при необходимости различать терминалы и нетерминалы. Технически или традиционно я думаю, что грамматика, вероятно, должна была бы быть написана в более сложной форме, такой как эта (где 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
... не то чтобы это действительно что-то меняет, но я подумал, что должен это упомянуть.
РЕДАКТИРОВАТЬ: Что-то еще, что пришло в голову, когда я прочитал ответ Гаше, это то, что каждая ветвь в дереве в моем примере представляет подсчет. Если вы посмотрите на каждое производственное правило как на функцию, в которой LHS представляет результат, а RHS представляет его аргументы, то структура грамматики определяет, как составляются функции.
Другими словами, контекст синтаксического анализатора вместе с его механизмом предварительного просмотра помогает определить не только, какие функции применять (своего рода параметрический полиморфизм), но и то, как они должны быть скомпонованы вместе для формирования новых функций.
По крайней мере, я полагаю, что вы могли бы взглянуть на это таким образом для однозначных CFG, для других грамматик умственная гимнастика для меня сейчас слишком велика.