Що б ви отримали, якщо додати параметри до контекстних граматик?


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 (та інші подібні мови) не обмежуються таким чином; вони приймають все, що бажає користувач. Це не впливає на синтаксичність (за винятком обробки символів вкладок), але було б важко висловитись із вашою пропозицією, принаймні, наскільки я це розумію.
rici


@HendrikJan, граматики атрибутів - це спосіб коментування граматики семантичною дією, вони не контролюють розбір.
AProgrammer

1
Якщо мета - обробка відступів, то це більше підходить для токенізатора, а не для аналізатора. Якщо токенізатор випромінює віртуальні маркери INDENT та UNINDENT, коли рівень відступу змінюється. Тоді не потрібно доповнювати граматику мови інформацією про відступи.
Джон Кугельман

Відповіді:


14

Графіки Affix (параметризовані контекстні граматики) широко вивчалися відомим голландським вченим-комп’ютером Корнелісом Х. А. Костер , починаючи зі своєї статті 1962 року "Основна англійська мова, генеративна граматика частини англійської мови", співавторованої з LGLT Meertens. У 1970 році він випустив формалізм концепції; корисний огляд є у його статті 1971 р. "Графіки Affix для мов програмування", версію якої я знайшов у Citeseer .

У цьому документі Костер порівнює свій формалізм (і ще один подібний) з дворівневими граматиками Ван Війнгаарда і вважає, що вони дуже схожі.

Неоціненна анотована бібліографія методик розбору Діка Груна включає велику кількість інших корисних посилань на прикріплення граматик та інших нехомських формалізмів. (Див. Розділ 18.2.6 бібліографії, хоча в інших розділах є корисні статті.) Grune коротко висвітлює прикріплення граматик у § 15.3.2 другого видання Техніки Парсінга: Практичний посібник (а ще коротше в першому виданні , доступне в Інтернеті), згадуючи про те, що легко адаптувати методики розбору зверху вниз (та інші).

Якщо область параметрів не є кінцевою, і в цьому випадку їх можна усунути, статично генеруючи всі можливі постановки, що призводять до CFG, клас графів афікса, безумовно, є суворим набором безлічі контекстних граматик. (Графіку афікси для можна знайти в посиланні Діка Груна на Техніку розбору вище.)anbncn

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


Я вважаю, що мови CDL більше схожі на граматики атрибутів : значення атрибутів можна обчислити за допомогою зовнішньо визначених функцій. Я б зарезервував граматику афікси назви для випадків, коли взаємозв'язки між значеннями афіксів (атрибутів) визначені у формалізмі, як у розширених графіках Affix .
reinierpost

@reinierpost: Ви, звичайно, маєте право на власну термінологію; пільга не обмежується антропоморфними яйцями. Однак сам посібник CDL стверджує, що "CDL3 є мовою реалізації, заснованою на графіках афікса", які, на мою думку, слід враховувати. (Посібник доступний на ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf ). Ось що я стверджував у своїй відповіді: CDL базувався на роботі Костера над прикріплюючими граматиками. Як зазначає Грюн, різниця між графіками афіксу та атрибутами незначна; його відмінністю є те, чи використовуються афікси для вирішення синтаксичної дійсності.
rici

(Цитата з першої сторінки посібника.)
rici

Я знаю ... і ти маєш рацію. Мій коментар не мав на меті суперечити вам.
reinierpost

6

Візьміть насосну лему для CFG :

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

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

Це описує зірковий трикутник:

*
**
***
**
*

Немає способу розділити зоряний трикутник на 5 частин таким чином, що також є зірковим трикутником (з не порожнім).{ u v n w x n y | n > 0 } v xuvwxy{uvnwxny|n>0}vx

Це означає, що трикутник зірки - це не вільна від контексту мова.

Або простіший приклад:

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

Це описує мову що не є контекстним.{bnabnabn|n0}


3

Я ніколи не бачив, щоб цей формалізм був представлений (навіть у чомусь на кшталт методики розбору Груна ), залежно від деталей того, як ви точно визначаєте "параметри повинні бути в основному аналізаторами". граматика необмеженої фазової структури (тобто більш потужна, ніж залежно від контексту, ви можете написати граматику VW, яка дає всі програми зупинки).



Наскільки мені відомо, Костер та його група вивчали два типи афіксичних граматик: 1) обмежені форми граматик Ван Війнгаарда, що мали на меті легше розпізнати; 2) мови CDL, мови опису практичного компілятора без явного маніпулювання значенням афікси, але з можливістю визначення правил цільовою мовою (наприклад, асемблера), що робить їх Turing завершеним.
reinierpost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.