Alt-üles analüüsi korral on kõige tähtsam samm töödeldavas stringis aluse (mingi produktsiooni parema poole) tunnistamine. Selleks on välja töötatud palju algoritme; ühed kiirematest on eelnevusrelatsioonide kasutamisel põhinevad algoritmid. Eelnevusrelatsioone kasutavaid algoritme on mitmeid, vaatleme järgnevas algoritmi, mis põhineb nn lihtsa eelnevusgrammatika kasutamisel; seda algoritmi kasutati ka TTÜ-s loodud translaatorite kompileerimise (compiler compiler) süsteemis ELMA.
Relatsioon on binaarne relatsioon kõigi terminalide ja mitteterminalide hulgal: U V, kui leiduvad produktsioonid
X uUYv
Y Vw
See tähendab, et kui redutseeritavas sõnas on
järjest sümbilid ...UV...
ja U V,
siis sümbolist V algab uus
alus. Suhte U
V arvutamiseks tuleb
a) leida produktsioonide paremates pooltes kõik
kõrvutiseisvate sümbolite paarid (U,Y), kus teine sümbol Y on mingi mitteterminal;
b) leida mitteterminali Y jaoks
kõik grammatika sümbolid V,
millega võib alata mingi Y-st
saadav string;
c) märkida suhe U V kõigi selliste sümbolite
vahele.
Relatsioon on binaarne relatsioon kõigi terminalide ja mitteterminalide hulgal: U V, kui leidub produktsioon
X uUYv
See tähendab, et sümbolid U, V kuuluvad samasse alusesse (s.t. alus jätkub).
Relatsioon on binaarne relatsioon, mille teine liige on terminal; U a (a on terminal !) kui leiduvad produktsioonid
X uYZv
Y wU
Z az
võiZ = a
See tähendab, et sümboliga U
lõpeb alus. Suhte U a arvutamiseks tuleb:
a) leida produktsioonide paremates pooltes kõik
järjestikused sümbolite (Y,Z)
paarid, kus esimene sümbol Y
on mitteterminal
b) leida kõik sümbolid U,
mis võivad tekkida Y-st
saadud stringi lõppu (derivatsioonis tehakse vähemalt
üks samm!)
c) kui paari teine sümbol Z
on mitterminal, leitakse kõik terminalid a, mis võivad tekkida Z-st saadud stringi alguses (või
on Z ise terminal a)
d) märkida suhe U a kõigi selliste paaride vahele.
Grammatikat nimetatakse eelnevusgrammatikaks, kui:
1) kõik eelnevusrelatsioonid on üheselt määratud,
s.t. mitte mingite sümbolite U,V
vahel ei või olla kaht erinevat eelnevusrelatsiooni
(võibolla ei ole ühtegi!);
2) grammatikas ei ole kaht sama parema poolega reeglit X U, Y U;
3) grammatikas ei ole tühja parema poolega reegleid X v.a. juhul, kui X on algussümbol ja X ei esine ühegi reegli paremal
poolel.
Eelnevusgrammatika puhul on alt-üles analüüs lihtne: igal sammul loetakse analüüsitavat stringi vasakult paremale, kuni leitakse sümbolite jada
U V1 V2 V2 ... Vn a
String V1V2V2 ... Vn on alus, s.t. leidub produktsioon X V1V2V2 ... Vn, seega asendatase string V1V2V2 ... Vn mitteterminaliga X; selliselt jätkates peab analüüsi lõppedes tekkima string #S#, kus S on grammatika algussümbol (# on sümbol, millega analüüsitav string piiratakse mõlemalt poolt enne analüüsi algust).Näide 1. Grammatika
X aXXb | c
eelnevusrelatsioonid on määratud tabeliga :
X |
a |
b |
c |
# |
|
X |
|||||
a |
|||||
b |
|||||
c |
|||||
# |
Sõna acaccbb alt-üles analüüsil tehakse järgmised sammud:
#acaccbb# # acaccbb# # a caccbb# # a c accbb# # a X accbb# ... # a X a c cbb# ... # a X a X c bb# ... # a X a X X bb# ... # a X X b# # X # OK
Näide 2. Grammatika
T a X | b Y | TT |
X 0 X | 1
Y 0 Y | 1
T T1 |
T1 a X | b Y | TT
X 0 X | 1
Y 0 Y | 1
Avaldis Term | Term +
Avaldis | Term - Avaldis
Term Tegur | Tegur * Term | Tegur / Term
Tegur Ident | Const | (Avaldis)
Avaldis Term
Avaldise_lõpp
Term Tegur Termi_lõpp
Tegur Ident | Const | (Avaldis)
Avaldise_lõpp + Avaldis | - Avaldis
|
Termi_lõpp * Term | / Term |
Avaldis Avaldis + Yksl
| Yksl
Yksl Yksl * Tegur | Tegur
Tegur Ident | Const | ( Avaldis )
Avaldis Avaldis +
Yksl1 | Yksl1
Yksl1 Yksl
Yksl Yksl * Tegur | Tegur
Tegur Ident | Const | ( Avaldis )
S 0S11 | 011
on eelnevusgrammatika?S if Tingimus then
S else S | S ; S |
Tingimus Boolean | Tingimus or
Boolean | Tingimus and Boolean
Boolean 0 | 1
number
0|1|2|3|4|5|6|7|8|9
numbrid number | number numbrid
r_arv numbrid | numbrid "." numbrid
number
0|1|2|3|4|5|6|7|8|9
numbrid number | number numbrid
r_arv numbrid kümnendosa
kümnendosa "." numbrid