320 likes | 524 Views
Neliels atskats nesenajā pagātnē …. Vai valoda L={a n b n c n | n≥1} ir aprakstāma ar bezkonteksta gramatiku?. Protams, nē !. Vai tas nozīmē, ka joprojām nemākam noskaidrot vārda piederību valodai?. Protams, nē !. Kas tad ir mainījies?. Kaut ko zinām par atribūtiem.
E N D
Neliels atskats nesenajā pagātnē … Vai valoda L={anbncn | n≥1} ir aprakstāma ar bezkonteksta gramatiku? Protams,nē! Vai tas nozīmē, ka joprojām nemākam noskaidrot vārda piederību valodai? Protams,nē! Kas tad ir mainījies?
Kaut ko zinām par atribūtiem L’=L(a+b+c+)={anbmck | n,m,k≥1} S ABC A a A Aa B b B Bb C c C Cc
S.der := (A.skaits=B.skaits)&(B.skaits=C.skaits) S ABC A a A A1a B b B B1b C c C C1c A.skaits := 1 A.skaits := A1.skaits+1 B.skaits := 1 B.skaits := B1.skaits+1 C.skaits := 1 C.skaits := C1.skaits+1
Formālās apraksta metodes • Sintakses vadītas definīcijas (syntax-directed definitions) - augsta līmeņa specifikācijas, precīzi nenorādot translācijas kārtību. • Translācijas shēma(translation scheme) - precīzi norāda translācijas kārtību.
Sintakses vadītas definīcijas • Katra produkcija A <alfa> ir saistīta ar likumu kopu formā b=f(c1,c2,...,cn), kur ir spēkā viens no diviem gadījumiem: • b ir A sintezētais atribūts un c1,c2,...,cn ir produkcijas simboliem piederoši atribūti • b ir kāda produkcijas labās puses simbola mantotais atribūts un c1,c2,...,cnir produkcijas simboliem piederoši atribūti. • Vienmēr b ir atkarīgs no c1,c2,...,cn. Atribūtu gramatika ir sintakses vadīta definīcija, kur semantisko likumufunkcijām nav blakusefektu.
Translācijas shēma • semantiskās darbības tiek iekļautas produkciju labajā pusē, kas nosaka atribūtu aprēķināšanas kārtību
ETR Raddop T {print(addop.lexeme)}R1| Tnum {print(num.val)} Šeit addop un num – atbilst termināļiem(darbības zīmes (+ vai - ) vai cipari) Kas tiks izvadīts, ja ievadā būs 9-5+2 ?
E R 3 T 1 - T R 5 2 9 5 + T R 4 2 95-2+ 9-5+2
Atribūtu gramatiku tipi • S-atribūtu gramatikas (S-attributed grammars) • L-atribūtu gramatikas (L-attributed grammars) • Izdevīgas tāpēc, ka nav nepieciešams atklātā veidā būvēt analīzes koku
S-atribūtu gramatikas • tikai sintezēti atribūti • sintakses vadīta definīcija ir pietiekama tās aprakstīšanai • vērtības var tikt aprēķinātas augšupejoši, izmantojot steku
Bināra skaitļa vērtības aprēķināšana • N B$ • B B11 • B B10 • B 1 • B 0 Kādas darbības pie katras produkcijas jāveic?
Bināra skaitļa vērtības aprēķināšana • N B$ N.val = B.val • B B11 B.val = B1.val * 2 + 1 • B B10 B.val = B1.val * 2 • B 1 B.val = 1 • B 0 B.val = 0 Vai kāds vēl atceras, kā uzbūvēt analizatoru?
N B $ N.val = B.val • B B11 B.val = B1.val * 2 + 1 • B B10 B.val = B1.val * 2 • B 1 B.val = 1 • B 0 B.val = 0
N B $ N.val = B.val • B B11 B.val = B1.val * 2 + 1 • B B10 B.val = B1.val * 2 • B 1 B.val = 1 • B 0 B.val = 0 Stekā kopā ar simbolu glabās arī vērtību (Simbols val)
Kā aprēķināt nepieciešamās vērtības skatoties tikai uz steku un zinot, kāda darbība tiek pielietota?
S-atribūtu gramatikas • katrs bērnu zars ievieto tā sintezēto atribūtu vērtības stekā • pie reducēšanas vecāks tās izņem un izmanto savu atribūtu vērtību aprēķināšanai, kuras pēc tam atkal tiek ievietotas stekā
Bināra skaitļa vērtības aprēķināšana • N B$ • B B11 • B B10 • B 1 • B 0 print(val(top)) val(newtop):=val(top-1)*2+val(top) val(newtop):=val(top-1)*2+val(top)
Cits piemērs print(val(top)) val(newtop):=val(top-2)+val(top) val(newtop):=val(top-2)*val(top) val(newtop):=val(top-1)
Gramatikai • SL.L | L | L. | .L • LLB | B • B0 | 1 • izveidot atribūtu gramatiku, ar kuras palīdzību varētu aprēķināt binārā skaitļa vērtību! • Piemēram, 101.101 vērtība ir 5.625, • 11, 11., 11.000 vērtība ir 3, • .01 vērtība ir 0.25
Iepriekšējais uzdevums, ja vienīgais B sintezētais atribūts ir c, kas norāda, kāds ir šī cipara “ieguldījums” kopējā vērtībā. • Piemēram, 101.101 pirmā vieninieka ieguldījums ir 4, bet pēdējā – 0.125 .
L-atribūtu gramatikas • gan sintezēti, gan mantoti atribūti • lieto translācijas shēmu aprakstīšanai • katrs A sintezētais atribūts produkcijā A X1X2...Xn ir atkarīgs tikai no A mantotajiem atribūtiem un Xi atribūtiem • katrs mantotais atribūts Xi produkcijā A X1X2...Xn ir atkarīgs tikai no: • brāļu pa kreisi atribūtiem • A mantotajiem atribūtiem
L-atribūtu gramatikas • Semantiskās darbības tiek iekļautas sekojoši: • darbība, kas saistīta ar sintezēto atribūtu tiek novietota produkcijas labajā galā (to var aprēķināt tikai tad, kad visu atribūtu vērtības uz kurām ir atsauces, ir aprēķinātas) • darbība nedrīkst atsaukties uz sintezēto atribūtu pa labi no šīs darbības • labās puses simbola atribūta mantotajiem atribūtiem jābūt izrēķinātiem darbībās pirms šī simbola
L-atribūtu gramatikas • Kā šādas gramatikas iekļaut augšupejošā analīzē? • Problēma: AB {C.i=f(A.s)} C • kurā brīdī un kā veikt atribūtu aprēķināšanu (C tobrīd vēl nav stekā) • Risinājums: Iekļaut papildus produkciju, kas izveidota vienīgi šim mērķim: • ABA’C {A’.i=A.s; C.i=A’.s} • A’ {A’.s=f(A’.i)} • Analizētājam diez ko nepatīk produkcijas
L-atribūtu gramatikas • Praksē: • Translēt gramatiku ar L-atribūtu definīcijām paredzošajā analīzē • problēma: kreisā rekursija • Translēt gramatiku ar L-atribūtu definīcijām augšupejošā analīzē • problēma: mantoto atribūtu aprēķināšana
L-atribūtu gramatikas paredzošajā analīzē Jātiek vaļā no kreisās rekursijas: AA1Y {A.a = g(A1.a, Y.y)} AX {A.a=f(X.x)} AX {R.i = f(X.x)} R {A.a = R.s} RY {R1.i = g(R.i,Y.y)} R1 {R.s=R1.s} R {R.s = R.i}
L-atribūtu gramatikas augšupejošā analīzē • Pārvietot atribūtu aprēķināšanas likumu no produkcijas vidus uz beigām: • ievieš fiktīvu (markera) netermināli M • ievieto šo netermināli likuma vietā • pievieno produkciju M un pievieno atribūtu aprēķināšanas likumu pie šīs produkcijas
L-atribūtu gramatikas augšupejošā analīzē • Mantotie atribūti analizētāja stekā. • ja mantotie atribūti tiek aprēķināti ar kopēšanas palīdzību (t.i. Y.i=X.s) tad, ja nepieciešams, jāņem vērtība X.s no steka • šī pieeja strādā tikai tad, ja skaidri zināms, kur stekā atrodas X.s vērtība
L-atribūtu gramatikas augšupejošā analīzē SaAC C.i=A.s SbABC C.i=A.s Cc C.s=g(C.i) Stekā starp A un C var atrasties arī B (bet var arī nebūt). Līdz ar to pie Cc savēršanas C.i (A.s) var atrasties gan val[top-1], gan val[top-2].
L-atribūtu gramatikas augšupejošā analīzē SaAC C.i=A.s SbABMC M.i=A.s C.i=M.s Cc C.s=g(C.i) M M.s=M.i Tagad pie Cc savēršanas C.i (A.s vai M.s) vienmēr atradīsies val[top-1].
Atribūtu dzīves ilgums 1 3 7 9 5 6 2 8 4
Ierobežojumi • Nelietojot globālus datus, dažas no semantiskajām akcijām nav iespējams veikt. • Piemēram: • pārbaudīt, vai mainīgais ir definēts pirms izmantošanas, • pārbaudīt mainīgā tipu un adresi, • pārbaudīt, vai mainīgais ir lietots, vai nē.
Globālie dati • Ja daudz globālo datu tipu, kods kļūst grūti pārvaldāms. • Daži, raksturīgākie izmantošanas veidi ar skaidru mērķi: • simbolu tabula, • GOTO iezīmes, • atliktās (forward) deklarācijas.