Примеры грамматик LL(1), LR(1), LR(0), LALR(1)?

есть ли хороший ресурс в интернете с коллекцией грамматик для некоторых основных алгоритмов синтаксического анализа(LL(1), LR(1), LR(0), LALR (1))? Я нашел много отдельных грамматик, которые попадают в эти семьи, но я не знаю хорошего ресурса, где кто-то написал большой набор примеров грамматик.

кто-нибудь знает такой ресурс?

3 ответов


Методы Анализа: Практическое Руководство имеет несколько примеров (т. е., вероятно, полдюжины или около того на тип) почти каждого типа грамматики. Вы можете приобрести 2-е издание книги, хотя 1-е издание доступно бесплатно на авторском сайт в формате PDF (в нижней части ссылки).

У автора также есть некоторые тестовые грамматики, которые он связывает со своими примерами кода из второго издания, которые можно найти здесь.

Примечание: все эти грамматики малы (менее пары десятков правил), из-за того, что это, очевидно, опубликованная книга.


примеры из Википедии

LL (1)

грамматика

S -> F
S -> ( S + F )
F -> a

вход

( a + a )

разбор шагов

S -> "(" S "+" F ")"
  -> ( "F" + F ) 
  -> ( "a" + F ) 
  -> ( a + "a" )       

LR (0)

грамматика

(1) E → E * B
(2) E → E + B
(3) E → B
(4) B → 0
(5) B → 1 

вход

1 + 1

парсинг шаги

need to build a parser table and traverse through states.

LR (1)

грамматика

S’ -> S S 
S  -> C C 
C  -> c C | d

вход

cd

разбор шагов

large table

LALR

грамматика

A -> C x A | ε
B -> x C y | x C
C -> x B x | z

вход

xxzxx

разбор шагов

traverse large parser table

вы также можете иметь посмотреть


Я не ожидал, что вы найдете большие коллекции грамматик, организованных таким образом специально. Что получит организатор взамен?

что у вас может быть шанс сделать, это найти генераторы парсера, соответствующие каждому семейству (например, LL(1)), и пойти искать экземпляры входов для этого генератора парсера, все из которых будут LL(1) по определению. Например, грамматики ANTLR - это все различные версии LL (k) в зависимости от того, какую версию ANTLR вы выбираете ( описание версии ANTLR покажет, что k она принимает); Bison грамматики все LALR (1) [игнорируя недавнюю опцию GLR]. Если вы зайдете на мой сайт (см. bio), вы увидите список грамматик, которые в значительной степени свободны от контекста (то есть не в любом из классов, которые вы описываете).

EDIT: обратите внимание на разъяснение @Bart Kier, что ANTLR может явно пометить грамматику как LL (k) для конкретного k.