Jump to content

Грамматика Ван Вейнгаардена

(Перенаправлено с W-грамматики )

В информатике грамматика Ван Вейнгаардена (также vW-грамматика или W-грамматика). [1] ) — формализм для определения формальных языков . Название происходит от формализма, изобретенного Адрианом ван Вейнгаарденом. [2] с целью определения АЛГОЛ 68 языка программирования . Полученная спецификация [3] остается его наиболее заметным применением.

Грамматики Ван Вейнгаардена решают проблему, заключающуюся в том, что контекстно-свободные грамматики не могут выражать согласие или ссылку, когда две разные части предложения должны каким-то образом согласовываться друг с другом. Например, предложение «Птицы ели» не является стандартным английским языком , поскольку в нем не согласовывается число . Контекстно-свободная грамматика будет анализировать фразы «Птицы ели», «Птицы ели» и «Птица ела» одинаково. Однако преимуществом контекстно-свободных грамматик является простота, тогда как грамматики Ван Вейнгаардена считаются очень сложными. [4]

Два уровня

[ редактировать ]

W-грамматики — это двухуровневые грамматики : они определяются парой грамматик, которые работают на разных уровнях:

Набор строк, генерируемых W-грамматикой, определяется двухэтапным процессом:

  1. внутри каждого гиперправила для каждого встречающегося в нем атрибута подобрать для него значение, сгенерированное метаграмматикой; результатом является обычное контекстно-свободное грамматическое правило; делайте это всеми возможными способами;
  2. используйте полученную (возможно, бесконечную) бесконтекстную грамматику для генерации строк обычным способом.

Согласованная замена, используемая на первом этапе, аналогична замене в логике предикатов и фактически поддерживает логическое программирование ; это соответствует унификации в Прологе , как заметил Ален Кольмерауэр [ где? ] .

W-грамматики полны по Тьюрингу ; [5] следовательно, все проблемы принятия решений, касающиеся языков, которые они генерируют, таких как

  • генерирует ли W-грамматика заданную строку
  • генерирует ли W-грамматика вообще никаких строк

неразрешимы .

Сокращенные варианты, известные как аффиксные грамматики , были разработаны и применены при построении компиляторов и для описания естественных языков.

Программы определенной логики , то есть логические программы, в которых не используется отрицание, можно рассматривать как подкласс W-грамматик. [6]

Мотивация и история

[ редактировать ]

В 1950-х годах начались попытки применить компьютеры для распознавания, интерпретации и перевода естественных языков, таких как английский и русский. Для этого требуется машиночитаемое описание фразовой структуры предложений, которое можно использовать для их анализа и интерпретации, а также для их генерации. Для этой цели были приняты бесконтекстные грамматики — концепция структурной лингвистики ; их правила могут выражать то, как предложения рекурсивно строятся из частей речи , таких как именные группы и глагольные группы , и, в конечном итоге, из слов, таких как существительные , глаголы и местоимения .

Эта работа повлияла на разработку и реализацию языков программирования , в первую очередь на АЛГОЛ 60 , который представил синтаксическое описание в форме Бэкуса-Наура .

Однако контекстно-свободные правила не могут выражать согласие или ссылку ( анафору ), когда две разные части предложения должны каким-то образом согласовываться друг с другом.

Их можно легко выразить в W-грамматиках. (См. пример ниже.)

В языках программирования существуют аналогичные понятия типизации и области видимости . Компилятор или интерпретатор языка должен распознавать, какие варианты использования переменной принадлежат друг другу (ссылаются на одну и ту же переменную). Обычно это связано с такими ограничениями, как:

  • Переменная должна быть инициализирована до использования ее значения.
  • В строго типизированных языках каждой переменной присваивается тип, и все использования переменной должны соответствовать ее типу.
  • Часто его тип необходимо явно объявить перед использованием.

W-грамматики основаны на идее предоставления нетерминальным символам контекстно-свободных грамматик атрибутов (или аффиксов ), которые передают информацию между узлами дерева разбора , используемых для ограничения синтаксиса и определения семантики.

Эта идея была хорошо известна в то время; например, Дональд Кнут посетил комитет по проектированию Алгола 68, разрабатывая свою собственную версию — грамматики атрибутов . [7]

Дополняя описание синтаксиса атрибутами, можно проверить ограничения, подобные приведенным выше, исключив множество недопустимых программ во время компиляции. Как писал Ван Вейнгаарден в своем предисловии: [2]

Моими главными возражениями были наверняка ненужные мне ограничения и определение синтаксиса и семантики. На самом деле синтаксис, рассматриваемый в MR 75, создает большое количество программ, тогда как я бы предпочел иметь как можно большее подмножество значимых программ, что требует более строгого синтаксиса. [...] вскоре стало ясно, что некоторые более эффективные инструменты, чем нотация Бэкуса, могут быть выгодными [...]. Я разработал схему [...], которая позволяет конструкции языка нести в синтаксисе гораздо больше информации, чем обычно.

Весьма специфичным для W-грамматик было их строгое обращение с атрибутами как со строками, определяемыми контекстно-свободной грамматикой, для которой конкатенация является единственной возможной операцией; сложные структуры данных и операции могут быть определены путем сопоставления с образцом . (См. пример ниже.)

После их представления в «Заключительном отчете» АЛГОЛА 68 1968 года W-грамматики считались слишком мощными и неограниченными, чтобы быть практичными. [ нужна ссылка ]

Отчасти это было следствием того, как они применялись; «Пересмотренный отчет» Алгола 68 1973 года содержит гораздо более удобочитаемую грамматику без изменения самого формализма W-грамматики.

Между тем, стало ясно, что W-грамматики, когда они используются во всей своей общности, действительно слишком мощны для таких практических целей, как использование входных данных для генератора синтаксического анализатора . Они описывают в точности все рекурсивно перечислимые языки . [8] является неразрешимой проблемой что делает синтаксический анализ невозможным в целом: решить, может ли данная строка быть сгенерирована данной W-грамматикой, .

Следовательно, их использование должно быть серьезно ограничено при автоматическом синтаксическом анализе или переводе. Для решения этой проблемы были разработаны ограниченные и модифицированные варианты W-грамматик, например

После 1970-х годов интерес к этому подходу угас; время от времени публикуются новые исследования. [9]

Соглашение в английской грамматике

[ редактировать ]

В английском языке существительные, местоимения и глаголы имеют такие атрибуты, как грамматическое число , род и лицо , которые должны согласовываться между подлежащим , основным глаголом и местоимениями, относящимися к подлежащему:

  • Я умываюсь.
  • Она моется сама.
  • Мы моемся.

являются действительными предложениями; недействительными являются, например:

  • *Я умываюсь.
  • *Она моется.
  • *Мыемся.

Здесь соглашение служит для того, чтобы подчеркнуть, что оба местоимения (например, я и я ) относятся к одному и тому же человеку.

Контекстно-свободная грамматика для генерации всех таких предложений:

 <sentence> ::= <subject> <verb> <object>
 <subject>  ::= I | You | He | She | We | They
 <verb>     ::= wash | washes
 <object>   ::= myself | yourself | himself | herself | ourselves | yourselves | themselves

От <sentence>, мы можем сгенерировать все комбинации:

I wash myself
I wash yourself
I wash himself
[...]
They wash yourselves
They wash themselves

W-грамматика для генерации только допустимых предложений:

 <sentence <NUMBER> <GENDER> <PERSON>>
   ::= <subject <NUMBER> <GENDER> <PERSON>>
       <verb <NUMBER> <PERSON>>
       <object <NUMBER> <GENDER> <PERSON>>

 <subject singular <GENDER> 1st> ::= I
 <subject <NUMBER> <GENDER> 2nd> ::= You
 <subject singular male 3rd>     ::= He
 <subject singular female 3rd>   ::= She
 <subject plural <GENDER> 1st>   ::= We
 <subject singular <GENDER> 3rd> ::= They

 <verb singular 1st>    ::= wash
 <verb singular 2nd>    ::= wash
 <verb singular 3rd>    ::= washes
 <verb plural <PERSON>> ::= wash

 <object singular <GENDER> 1st> ::= myself
 <object singular <GENDER> 2nd> ::= yourself
 <object singular male 3rd>     ::= himself
 <object singular female 3rd>   ::= herself
 <object plural <GENDER> 1st>   ::= ourselves
 <object plural <GENDER> 2nd>   ::= yourselves
 <object plural <GENDER> 3rd>   ::= themselves

 <NUMBER> ::== singular | plural
 <GENDER> ::== male | female
 <PERSON> ::== 1st | 2nd | 3rd

Стандартный неконтекстно-свободный язык.

[ редактировать ]

Хорошо известен неконтекстно-свободный язык.

Двухуровневая грамматика этого языка — метаграмматика.

Н ::= 1 | N1
X ::= а | б

вместе с грамматической схемой

Начало ::= ⟨а Н ⟨б Н ⟨а Н
⟨Х N1 ::= ⟨X Н Х
⟨Х 1 ::= Х

Вопросы. Если заменить N1 новой буквой, скажем, C, сохранится ли язык, порожденный грамматикой? Или N1 следует читать как строку из двух символов, то есть за N следует 1? Конец вопросов.


Требование допустимого использования переменных в ALGOL

[ редактировать ]

Пересмотренный отчет об алгоритмическом языке Алгол 60 [10] определяет полный контекстно-свободный синтаксис языка.

Назначения определяются следующим образом (раздел 4.2.1):

 <left part>
   ::= <variable> :=
     | <procedure identifier> :=
 
 <left part list>
   ::= <left part>
     | <left part list> <left part>
 
 <assignment statement>
   ::= <left part list> <arithmetic expression>
     | <left part list> <Boolean expression>

А <variable> может быть (кроме всего прочего) <identifier>, что, в свою очередь, определяется как:

<identifier> ::= <letter> | <identifier> <letter> | <identifier> <digit>

Примеры (раздел 4.2.2):

s:=p[0]:=n:=n+1+s
n:=n+1
A:=B/C-v-q×S
S[v,k+2]:=3-arctan(sTIMESzeta)
V:=Q>Y^Z

Выражения и присваивания должны быть проверены по типу : например,

  • в n:=n+1, n должно быть числом (целым или вещественным);
  • в A:=B/C-v-q×S, все переменные должны быть числами;
  • в V:=Q>Y^Z, все переменные должны иметь тип Boolean.

Вышеуказанные правила различают <arithmetic expression> и <Boolean expression>, но они не могут проверить, что одна и та же переменная всегда имеет один и тот же тип.

Это (неконтекстно-свободное) требование можно выразить в W-грамматике, аннотируя правила атрибутами, которые записывают для каждой используемой или присвоенной переменной ее имя и тип.

Эту запись затем можно перенести во все места грамматики, где необходимо сопоставить типы, и реализовать проверку типов.

Точно так же его можно использовать для проверки инициализации переменных перед использованием и т. д.

Можно задаться вопросом, как создавать такую ​​структуру данных и манипулировать ею без явной поддержки в формализме структур данных и операций над ними. Это можно сделать, используя метаграмматику для определения строкового представления структуры данных и используя сопоставление с образцом для определения операций:

 <left part with <TYPED> <NAME>>
   ::= <variable with <TYPED> <NAME>> :=
     | <procedure identifier with <TYPED> <NAME>> :=
 
 <left part list <TYPEMAP1>>
   ::= <left part with <TYPED> <NAME>>
       <where <TYPEMAP1> is <TYPED> <NAME> added to sorted <EMPTY>>
     | <left part list <TYPEMAP2>>
       <left part with <TYPED> <NAME>>
       <where <TYPEMAP1> is <TYPED> <NAME> added to sorted <TYPEMAP2>>
 
 <assignment statement <ASSIGNED TO> <USED>>
   ::= <left part list <ASSIGNED TO>> <arithmetic expression <USED>>
     | <left part list <ASSIGNED TO>> <Boolean expression <USED>>
 
 <where <TYPED> <NAME> is <TYPED> <NAME> added to sorted <EMPTY>>
   ::=
 
 <where <TYPEMAP1> is <TYPED1> <NAME1> added to sorted <TYPEMAP2>>
   ::= <where <TYPEMAP2> is <TYPED2> <NAME2> added to sorted <TYPEMAP3>>
       <where <NAME1> is lexicographically before <NAME2>>
 
 <where <TYPEMAP1> is <TYPED1> <NAME1> added to sorted <TYPEMAP2>>
   ::= <where <TYPEMAP2> is <TYPED2> <NAME2> added to sorted <TYPEMAP3>>
       <where <NAME2> is lexicographically before <NAME1>>
       <where <TYPEMAP3> is <TYPED1> <NAME1> added to sorted <TYPEMAP4>>
 
 <where <EMPTY> is lexicographically before <NAME1>>
   ::= <where <NAME1> is <LETTER OR DIGIT> followed by <NAME2>>
  
 <where <NAME1> is lexicographically before <NAME2>>
   ::= <where <NAME1> is <LETTER OR DIGIT> followed by <NAME3>>
       <where <NAME2> is <LETTER OR DIGIT> followed by <NAME4>>
       <where <NAME3> is lexicographically before <NAME4>>
 
 <where <NAME1> is lexicographically before <NAME2>>
   ::= <where <NAME1> is <LETTER OR DIGIT 1> followed by <NAME3>>
       <where <NAME2> is <LETTER OR DIGIT 2> followed by <NAME4>>
       <where <LETTER OR DIGIT 1> precedes+ <LETTER OR DIGIT 2>
 
 <where <LETTER OR DIGIT 1> precedes+ <LETTER OR DIGIT 2>
   ::= <where <LETTER OR DIGIT 1> precedes <LETTER OR DIGIT 2>
 
 <where <LETTER OR DIGIT 1> precedes+ <LETTER OR DIGIT 2>
   ::= <where <LETTER OR DIGIT 1> precedes+ <LETTER OR DIGIT 3>
       <where <LETTER OR DIGIT 3> precedes+ <LETTER OR DIGIT 2>
 
 <where a precedes b> :==
 <where b precedes c> :==
 [...]
 
 <TYPED>       ::== real | integer | Boolean
 
 <NAME>        ::== <LETTER> | <NAME> <LETTER> | <NAME> <DIGIT>
 <LETTER OR DIGIT> ::== <LETTER> | <DIGIT>
 <LETTER OR DIGIT 1> ::= <LETTER OR DIGIT>
 <LETTER OR DIGIT 2> ::= <LETTER OR DIGIT>
 <LETTER OR DIGIT 3> ::= <LETTER OR DIGIT>
 <LETTER>      ::== a | b | c | [...]
 <DIGIT>       ::== 0 | 1 | 2 | [...]
 
 <NAMES1>      ::== <NAMES>
 <NAMES2>      ::== <NAMES>
 <ASSIGNED TO> ::== <NAMES>
 <USED>        ::== <NAMES>
 <NAMES>       ::== <NAME> | <NAME> <NAMES>
 
 <EMPTY>       ::==
 <TYPEMAP>     ::== (<TYPED> <NAME>) <TYPEMAP>
 <TYPEMAP1>    ::== <TYPEMAP>
 <TYPEMAP2>    ::== <TYPEMAP>
 <TYPEMAP3>    ::== <TYPEMAP>

По сравнению с исходной грамматикой были добавлены три новых элемента:

  • атрибуты нетерминалов в том, что сейчас называется гиперправилами;
  • метаправила для указания допустимых значений атрибутов;
  • новые гиперправила для указания операций над значениями атрибутов.

Новые гиперправила являются ε -правилами: они генерируют только пустую строку.

Алгол 68 примеров

[ редактировать ]

В отчетах ALGOL 68 используются немного другие обозначения без <угловых скобок>.

АЛГОЛ 68, как указано в §2.1 итогового отчета 1968 г.

[ редактировать ]
a) program : open symbol, standard prelude,
      library prelude option, particular program, exit,
      library postlude option, standard postlude, close symbol.
 b) standard prelude : declaration prelude sequence.
 c) library prelude : declaration prelude sequence.
 d) particular program :
      label sequence option, strong CLOSED void clause.
 e) exit : go on symbol, letter e letter x letter i letter t, label symbol.
 f) library postlude : statement interlude.
 g) standard postlude : strong void clause train

АЛГОЛ 68, как указано в пересмотренном отчете 1973 г. §2.2.1, §10.1.1.

[ редактировать ]
 program : strong void new closed clause

 A) EXTERNAL :: standard ; library ; system ; particular.
 B) STOP :: label letter s letter t letter o letter p.

 a) program text : STYLE begin token, new LAYER1 preludes, 
        parallel token, new LAYER1 tasks PACK, 
        STYLE end token.
 b) NEST1 preludes : NEST1 standard prelude with DECS1, 
        NEST1 library prelude with DECSETY2, 
        NEST1 system prelude with DECSETY3, where (NEST1) is
        (new EMPTY new DECS1 DECSETY2 DECSETY3).
 c) NEST1 EXTERNAL prelude with DECSETY1 : 
        strong void NEST1 series with DECSETY1, go on token ; 
        where (DECSETY1) is (EMPTY), EMPTY.
 d) NEST1 tasks : NEST1 system task list, and also token, 
        NEST1 user task PACK list.
 e) NEST1 system task : strong void NEST1 unit.
 f) NEST1 user task : NEST2 particular prelude with DECS, 
        NEST2 particular program PACK, go on token, 
        NEST2 particular postlude, 
        where (NEST2) is (NEST1 new DECS STOP).
 g) NEST2 particular program : 
        NEST2 new LABSETY3 joined label definition
        of LABSETY3, strong void NEST2 new LABSETY3
        ENCLOSED clause.
 h) NEST joined label definition of LABSETY : 
        where (LABSETY) is (EMPTY), EMPTY ; 
        where (LABSETY) is (LAB1 LABSETY1), 
           NEST label definition of LAB1, 
           NEST joined label definition of$ LABSETY1. 
 i) NEST2 particular postlude :
        strong void NEST2 series with STOP.

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

a) program text : STYLE begin token, new LAYER1 preludes, 
       parallel token, new LAYER1 tasks PACK, 
       STYLE end token.

Это позволяет использовать BEGIN ... END и { } в качестве разделителей блоков, исключая при этом BEGIN ... } и { ... END.

Можно сравнить грамматику в отчете с анализатором Yacc для подмножества АЛГОЛА 68 Марка ван Леувена. [11]

Реализации

[ редактировать ]

Энтони Фишер написал йо-йо , [12] синтаксический анализатор большого класса W-грамматик с примерами грамматик для eva выражений , sal и Pascal ( фактический стандарт ISO 7185 для Pascal использует расширенную форму Бэкуса-Наура ).

Дик Грюн создал программу на языке C , которая генерировала все возможные варианты W-грамматики. [13]

Приложения вне АЛГОЛА 68

[ редактировать ]

Упомянутые выше применения расширенных аффиксных грамматик (EAG) можно эффективно рассматривать как приложения W-грамматик, поскольку EAG очень близки к W-грамматикам. [14]

W-грамматики также были предложены для описания сложных действий человека в эргономике . [ нужна ссылка ]

также предоставлено описание W-грамматики Для Ada . [15]

См. также

[ редактировать ]
  1. ^ Кливленд, Дж. Крейг; Узгалис, Роберт К. (1977). Грамматики языков программирования . Эльзевир. ISBN  978-0-444-00199-3 .
  2. ^ Jump up to: а б ван Вейнгаарден, Адриан (4 апреля 1972 г.) [Преждевременное и предварительное издание 22 октября 1965 г.]. MR 76: Ортогональный дизайн и описание формального языка (PDF) (Технический отчет). Амстердам: КРИ . Архивировано из оригинала (PDF) 2 октября 2017 г.
  3. ^ ван Вейнгаарден, А.; и др. (ред.). «Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68» . Архивировано из оригинала 24 января 2002 года.
  4. ^ Костер, ЦДХ (1996). «Создание Алгола 68». В Бьернере, Д; Брой, М.; Поттосин И.В. (ред.). Перспективы системной информатики . Конспекты лекций по информатике. Том. 1181. Берлин: Шпрингер. стр. 55–67. дои : 10.1007/3-540-62064-8_6 . ISBN  978-3-540-62064-8 .
  5. ^ Синцов, М. (1967). «Существование синтаксиса Ван Вейнгаардена для каждого рекурсивно перечислимого множества». Анналы Брюссельского научного общества . 2 : 115–118.
  6. ^ Дерансар, Пьер; Малушинский, Январь (1993), «Грамматические расширения логических программ» , «Грамматический взгляд на логическое программирование » , The MIT Press, стр. 109–140, doi : 10.7551/mitpress/3345.003.0008 , ISBN  9780262290845 , получено 14 июня 2023 г.
  7. ^ Кнут, Дональд Э. (1990), «Происхождение грамматик атрибутов» ( Plain TeX , gZiped ) , Материалы Международной конференции по грамматикам атрибутов и их применениям , Springer Verlag : 1–12 .
  8. ^ Синцов, М. (1967). «Существование синтаксиса Ван Вейнгаардена для каждого рекурсивно перечислимого множества». Анналы Брюссельского научного общества . 81 : 115–118.
  9. ^ Аугусто, LM (2023). «Двухуровневые грамматики: некоторые интересные свойства грамматик Ван Вейнгаардена» (PDF) . Омега - Журнал формальных языков . 1 :3–34.
  10. ^ Бэкус, Дж.В.; и др. (1963). «Доработанный отчет по алгоритмическому языку АЛГОЛ 60» . Компьютерный журнал . 5 (4): 349–367. дои : 10.1093/comjnl/5.4.349 .
  11. ^ «Синтаксис», Алгол 68 , FR : Univ Poitiers
  12. ^ Фишер, Энтони, «йо-йо», Программное обеспечение , Великобритания : Йорк .
  13. ^ Грюн, Дик, Генератор двухуровневых предложений , Нидерланды : VU .
  14. ^ Альблас, Хенк; Меличар, Боривой (1991). Атрибутные грамматики, приложения и системы . Конспекты лекций по информатике. Том. 545. Спрингер. п. 371. ИСБН  978-3540545729 .
  15. ^ Флауэрс, Рой, Описание W-грамматики для Ады (PDF) (магистерская диссертация), Технологический институт ВВС, Авиационный университет

Дальнейшее чтение

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d535e34ed49eb427d989edca8ebdd705__1721797020
URL1:https://arc.ask3.ru/arc/aa/d5/05/d535e34ed49eb427d989edca8ebdd705.html
Заголовок, (Title) документа по адресу, URL1:
Van Wijngaarden grammar - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)