Vhod: zaporedje leksikalnih simbolov
Izhod: drevo izpeljav (ali sled izpeljave)

Kontekstno neodvisna gramatika

Kontekstno neodvisna gramatika opisuje sintakso jezika s produkcijami:
Simbol je lahko:

  • končni: token iz abecede jezika, ki mu pripada semantična vrednost
  • vmesni: pojavi se na levi strani produkcije, en mora biti začetni

(Skrajno leva/desna) izpeljava: postopek izpeljave niza iz začetnega simbola z razširjanjem (skrajno levih/desnih) vmesnih simbolov leva/desna sled izpeljave
Drevo izpeljav: prikaz izpeljave

Dvoumnost gramatike: niz jezika gramatike ima več možnih dreves izpeljav

Algoritmi

LL (Left-to-right scan producing the Left-most derivation)

Leva sled izpeljave, drevo gradimo od zgoraj navzdol
Šibkejši od LR, ampak lažja implementacija na roke z boljšim upravljanjem napak

LL(k) gramatika: gledamo največ simbolov vnaprej v vseh celicah tabele mora biti največ produkcij

LL(1) gramatike

LL(1) iz prvega simbola razbere potrebno produkcijo.
Pogoj: za vsaki produkciji in mora veljati:

  • … vmesni simbol se lahko izpelje v prazen niz
  • … množica možnih končnih simbolov, ki so prvi simbol možnih nizov izpeljav
Generacija primerne gramatike za LL analizo:
  1. Pretvorba dvoumne v nedvoumno gramatiko:

Dvoumna in nedvoumna gramatika

Dvoumna gramatika:

Primera različnih dreves izpeljave istega niza id := id + id + id:

Nedvoumna gramatika: * je močnejši od +, leva asociativnost, simbol za konec niza



  1. Eliminacija leve rekurzije z uvedbo desne rekurzije preko novega simbola:

Primer

Problem stare:

Rešitev za novo:

  1. Levo faktoriranje koncev produkcij preko novega simbola:

Primer

Problem stare:

Rešitev za novo:

LL algoritem

Na vhodu prejemamo znake, na skladu imamo:

  • vmesne simbole - naredimo razvoj glede na tabelo produkcij glede na prvi vhodni simbol
  • končne simbole - če je prvi končni simbol na skladu enak prvemu vhodnemu simbolu naredimo pomik (zbrišemo enaka simbola)

LR (Left-to-right scan producing the Right-most derivation)

LR: desna sled izpeljave, drevo gradimo od spodaj navzgor
Analizira vse deterministične kontekstno neodvisne jezike

Zamakne odločitev izbire produkcije dokler ne vidi vseh simbolov desne strani produkcije
Implementacija odločanja med slednjima operacijama preko DKA:

  • dodaj naslednji vhodni simbol na sklad
  • odstrani simbole desne strani produkcije iz sklada in dodaj levi simbol produkcije na sklad

PEG (Parsing Expression Grammars) - Python

Sintaksni kombinatorji (Parser combinators) - novejši, nedorasli

Parser generatorji

Podamo opis želenega sintaksnega analizatorja, ki ga orodje generira-implementira
ANTLR implementira ALL(*) algoritem, v primeru več kot 1 produkcije uporabi KA za nadaljno analizo možnosti