Vraag Voorbeelden van LL (1), LR (1), LR (0), LALR (1) grammatica's?


Is er een goede bron online met een verzameling grammatica's voor enkele van de belangrijkste ontleedalgoritmen (LL (1), LR (1), LR (0), LALR (1))? Ik heb veel individuele grammatica's gevonden die in deze families vallen, maar ik ken geen goede bron waar iemand een groot aantal voorbeeldgrammatica's heeft geschreven.

Weet iemand van een dergelijke bron?


49
2018-06-25 21:26


oorsprong


antwoorden:


Parseertechnieken - Een praktische gids heeft verschillende voorbeelden (dat wil zeggen waarschijnlijk een stuk of zes per type) van bijna elk type grammatica. U kunt het boek met de 2de editie kopen, hoewel de 1e editie gratis beschikbaar is op de auteur website in PDF-vorm (onderaan de link).

De auteur heeft ook enkele testgrammatica's die hij bundelt met zijn codevoorbeelden uit de tweede editie, die te vinden is hier.

Opmerking: al deze grammatica's zijn klein (minder dan een paar dozijn regels), omdat dit duidelijk een gepubliceerd boek is.


18
2017-08-20 20:05



Voorbeelden van wikipedia

LL (1)

Grammatica

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

invoer

( a + a )

ontleed stappen

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

LR (0)

Grammatica

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

invoer

1 + 1

ontleed stappen

need to build a parser table and traverse through states.

LR (1)

Grammatica

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

invoer

cd

ontleed stappen

large table

LALR

Grammatica

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

invoer

xxzxx

ontleed stappen

traverse large parser table

Misschien wilt u ook een kijkje nemen


35
2017-07-04 20:34



Ik zou niet verwachten dat je opzettelijk een grote verzameling grammatica's op die manier zou vinden. Wat zou de organisator ervoor terugkrijgen?

Wat je misschien wel zou kunnen doen, is om parser-generators te vinden die overeenkomen met elke familie (bijv. LL (1)), en op zoek gaan naar instances van inputs voor die parser-generator, die allemaal LL (1) zullen zijn door definitie. De grammatica's van ANTLR zijn bijvoorbeeld allemaal verschillende versies van LL (k), afhankelijk van de versie van ANTLR die je kiest (de beschrijving van de ANTLR-versie zal vertellen wat K accepteert); Bizongrammatica's zijn allemaal LALR (1) [de recente GLR-optie negeren]. Als je naar mijn website gaat (zie bio), zie je een lijst met grammatica's die allemaal vrij veel contextvrij zijn (dat wil zeggen niet in een van de klassen die je beschrijft).

EDIT: Noteer de verduidelijking van @Bart Kier dat ANTLR expliciet een grammatica als LL (k) voor specifieke k kan markeren.


2
2018-06-30 08:19