Что вы получите, если добавите параметры в контекстно-свободные грамматики?

13

Я думал о грамматиках для чувствительных к индендангу языков, и похоже, что грамматики CF сработают, если их объединить с параметрами. В качестве примера рассмотрим этот фрагмент для упрощенной грамматики Python в ANTLR-подобном формате:

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

Мой вопрос: есть ли у этого вида грамматик (CFG с параметрами) имя?

Похоже, что для этой грамматики не составит труда написать парсер рекурсивного спуска (параметры должны быть в основном парсерами). Какие могут быть трудности с этим подходом?

Повышает ли добавление параметров поддерживаемый языковой класс над контекстно-свободным?

Айвар
источник
1
Если набор значений, которые могут принимать параметры, является конечным, то он по-прежнему тривиально свободен от контекста (затем вы можете перебирать все значения и записывать их все).
фрик с трещоткой
1
Стоит отметить, что ваше предложение предназначено для чувствительных к отступам языков с фиксированным отступом. Python (и другие подобные языки) не ограничены таким образом; они принимают любые отступы, которые хочет пользователь. Это не влияет на синтаксический анализ (за исключением обработки символов табуляции), но это будет трудно выразить в вашем предложении, по крайней мере, насколько я понимаю.
Ричи
@HendrikJan, грамматики атрибутов - это способ аннотировать грамматику семантическим действием, они не контролируют синтаксический анализ.
AProgrammer
1
Если цель состоит в обработке отступов, это больше подходит для токенизатора, а не парсера. Попросите токенизатор выдавать виртуальные токены INDENT и UNINDENT при изменении уровня отступа. Тогда нет необходимости дополнять грамматику языка информацией об отступах.
Джон Кугельман

Ответы:

14

Аффиксные грамматики (параметризованные контекстно-свободные грамматики) широко изучались выдающимся голландским ученым-компьютерщиком Корнелисом Х.А. Костером , начиная с его статьи 1962 года «Базовый английский, порождающая грамматика для части английского языка», написанной в соавторстве с LGLT Meertens. В 1970 году он создал формализм концепции; полезный обзор доступен в его статье 1971 года «Грамматика аффиксов для языков программирования», версию которой я нашел на Citeseer .

В этой статье Костер сравнивает свой формализм (и другой подобный) с двухуровневыми грамматиками Ван Вейнгаардена и находит их очень похожими.

Бесценная аннотированная библиография методов разбора Дика Груна включает большое количество других полезных ссылок для аффиксных грамматик и других нехомских формализмов. (См. Раздел 18.2.6 библиографии, хотя в других разделах есть полезные статьи.) Грюн кратко описывает аффиксные грамматики в п. 15.3.2 второго издания «Техника синтаксического анализа: практическое руководство» (и даже более кратко в первом издании (доступно онлайн), отмечая тот факт, что легко адаптировать нисходящие (и другие) методы синтаксического анализа.

aNбNсN

Костер, который также был редактором отчета Algol 68, был первым разработчиком языка описания компилятора (CDL) , основанного на его идеях о грамматике аффиксов. Этот инструментарий и его более поздние производные использовались в производстве в течение многих лет. На этой странице , которую я нашел с помощью поиска Google и чье постоянство я не могу гарантировать, есть ссылки на руководство и сайт загрузки для CDL3.

RICi
источник
Я чувствую, что языки CDL больше похожи на грамматику атрибутов : значения атрибутов могут быть вычислены внешне определенными функциями. Я бы зарезервировал грамматику аффикса имени для случаев, когда отношения между значениями аффиксов (атрибутов) определены в формализме, как в расширенных грамматиках аффиксов .
reinierpost
@reinierpost: Вы, конечно, имеете право на собственную терминологию; привилегия не ограничивается антропоморфными яйцами. Однако само руководство CDL утверждает, что «CDL3 - это язык реализации, основанный на грамматике аффиксов», который, я думаю, следует принимать во внимание. (Руководство доступно по адресу ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf ). Вот что я заявил в своем ответе: этот CDL основан на работе Костера над аффиксными грамматиками. Как указывает Грюн, разница между грамматиками аффиксов и атрибутов незначительна; его различие заключается в том, используются ли аффиксы для определения синтаксической достоверности.
Ричи
(Цитата с первой страницы руководства.)
rici
Я знаю ... и ты прав. Мой комментарий не должен был противоречить вам.
reinierpost
6

Возьмем лемму прокачки для CFG :

Взять грамматику

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

Это описывает звездный треугольник:

*
**
***
**
*

UvвесИксY{UvNвесИксNY|N>0}vИкс

Это означает, что звездный треугольник не является контекстно-свободным языком.

Или более простой пример:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

{бNaбNaбN|N0}

чокнутый урод
источник
3

Я никогда не видел этот формализм, представленный (даже в чем-то вроде техник синтаксического анализа Груна ), в зависимости от того, как именно вы определяете, «параметры должны быть в основном парсерами», он выглядит сопоставимым с двухуровневыми грамматиками ван Вейнгаардена, которые имеют ту же мощность, что и грамматика неограниченной фазовой структуры (т.е. более мощная, чем контекстно-зависимая, вы можете написать грамматику VW, которая дает все программы остановки).

AProgrammer
источник
Насколько мне известно, Костер и его группа изучали два типа аффиксических грамматик: 1) ограниченные формы грамматик Ван Вейнгаардена, предназначенные для облегчения распознавания; 2) языки CDL, практические языки описания компилятора без какой-либо явной манипуляции со значением аффикса, но с возможностью определять правила на целевом языке (например, на ассемблере), что делает их выполнение по Тьюрингу завершенным.
reinierpost