310 likes | 557 Views
Atribūtu gramatikas. Kompilatoram var būt nepieciešama papildus informācija, kas nav atkarīga no sintakses: tipu pārveidošana piešķiršanās parametru atbilstības noteikšana masīva robežu noteikšana u.c.
E N D
Kompilatoram var būt nepieciešama papildus informācija, kas nav atkarīga no sintakses: • tipu pārveidošana piešķiršanās • parametru atbilstības noteikšana • masīva robežu noteikšana • u.c.
Šādu “semantisku” informāciju var būt nepieciešams izskaitļot no citām vērtībām un tā var būt atkarīga no nelokālas informācijas.
Risinājums: anotēt analīzes koku • pievienot atribūtus katrai virsotnei (fiziski, protams, var atrasties citur). Ja analīzes koka virsotni uzskata par rakstu ar laukiem, tad atribūts ir lauka vārds • definēt atribūtu vērtību aprēķināšanas likumus (vienādojumus)
Definīcija • Atribūtu gramatika ir bezkonteksta gramatika, kuras • katram simbolam ir piesaistīta atribūtu kopa • katrai produkcijai ir piesaistīti šo atribūtu aprēķināšanas likumi
Atribūtu veidi • Vērtības tiek aprēķinātas no konstantēm un citu atribūtu vērtībām • sintezētie • vērtība tiek aprēķināta no bērnu atribūtiem • augšupejoša aprēķināšanas kārtība • mantotie (inherited) • vērtība tiek aprēķināta no vecāka un brāļiem • gramatiku vienmēr var pārrakstīt tā, lai no šī tipa atribūtiem izvairītos
S 3*5+4n n E.val=19 T.val=4 E.val=15 + F.val=4 T.val=15 cipars.lexval=4 T.val=3 F.val=5 * F.val=3 cipars.lexval=5 cipars.lexval=3
real id1,id2,id3 D L.in=real T.type=real , L.in=real real id3 , L.in=real id2 id1
Dažas piezīmes • termināļus var asociēt ar vērtībām, ko saņem no skenera. Šīs ievada vērtības tiek asociētas ar sintezētajiem atribūtiem • starta simbolam nevar būt mantotie atribūti • gramatikas simbola sintezētā atribūta vērtība var būt atkarīga no šī paša simbola mantotā atribūta vērtības • semantikas likumi tiek definēti katrai produkcijai atsevišķi • semantikas likumi, kas piesaistīti produkcijai A<alfa> jāspecificē visas: • A sintezēto atribūtu vērtības • <alfa> mantoto atribūtu vērtības
Piemērs Skaitļa pieraksts binārā vai oktālā skaitīšanas sistēmā ( B010, O37) Jāaprēķina skaitļa vērtība
Atkarības grafi • Ja atribūts b kādā analīzes koka zarā ir atkarīgs no atribūta c vērtības, tad b vērtības aprēķināšana var notikt tikai pēc c vērtības aprēķināšanas • Atribūtu vērtību aprēķināšanas secību var attēlot ar atkarības grafa palīdzību
Atkarības grafi (dependency graph) • Katru semantisko likumu pārveido formā b:=f(c1,c2,...,ck), ja nepieciešams, ievedot fiktīvu sintezēto atribūtu b • Katram atribūtam atbilst virsotne • Šķautne iet no virsotnes c uz virsotni b tad un tikai tad, ja b ir atkarīgs no c.
EE1+E2 E.val:=E1.val+E2.val E val + E1 val E2 val
D real id1,id2,id3 L.in=real 6 in 5 T.type=real 4type , real id3 3 entry L.in=real in 7 8 , L.in=real in 9 id2 10 2 entry id1 1 entry
Topoloģiskā kārtošana Orientēta acikliska grafa (dag) topoloģiskā kārtošana ir tā virsotņu m1,m2,...,mk sakārtošana tādā secībā, lai jebkurai šķautnei šajā grafā no mi uz mj , virsotne mi atrastos pirms virsotnes mj.
Semantisko likumu apstrādes metodes • Analīzes koka metodes.Atribūtu aprēķināšanas kārtību atrod no atkarības grafa. Nedarbojas, ja grafā atrodas cikls. • Likumbāzētas metodes.Kompilatora veidošanas laikā tiek analizēti ar produkcijām saistītie likumi. Katrai produkcijai atribūtu rēķināšanas secība tiek pilnīgi precīzi noteikta. • “Nevērīgās” metodes.Apstrādes kārtību nosaka neizmantojot semantiskos likumus. Ja translācija notiek analīzes laikā, tad apstrādi nosaka analīzes metodes.
Analīzes koks pozicija := sakums + atrums * 17 Piešķiršana := Izteiksme Identifikators + Izteiksme Izteiksme pozicija Identifikators * Izteiksme Izteiksme sakums Identifikators vesels skaitlis atrums 17
Sintakses koks id1 := id2 + id3 * 17 := + id1 * id2 id3 17
Sintakses koka būve • mknode(op,left,right) izveido virsotni ar iezīmi op un diviem laukiem ar norādēm. • mkleaf(id,entry) izveido identifikatora virsotni ar iezīmi id un norādi uz ierakstu simbolu tabulā. • mkleaf(num,val) izveido virsotni ar iezīmi num un lauku, kas satur skaitļa vērtību. • Katra no funkcijām kā rezultātu atdod norādi uz tikko izveidoto virsotni.
Sintakses koka būve id1 := id2 + id3 * 17 p1:=mkleaf(id,entryid3); p2:=mkleaf(num,17); p3:=mknode(‘*’,p1,p2); p4:=mkleaf(id,entryid2); p5:=mknode(‘+’,p4,p3); p6:=mkleaf(id,entryid1); p7:=mknode(‘:=’,p6,p5);
Izteiksmju orientētie acikliskie grafi Var uzlabot (nebūvēt pilnu koku), ja vispirms apskatās vai tāda virsotne jau nav priekšā. a+a*(b-c)+(b-c)*d + + * d * - a b c
1.piemērs • Izveidojiet izteiksmes a+a+(a+a+a+(a+a+a+a)) • aciklisko grafu (pieņemot, ka + ir kreisi asociatīva operācija)!
a+a+(a+a+a+(a+a+a+a)) + + + + + a
2.piemērs • Izveidojiet izteiksmes a+(a+a)+(a+(a+a)+a+(a+a)) • aciklisko grafu (pieņemot, ka + ir kreisi asociatīva operācija)!
+ a+(a+a)+(a+(a+a)+a+(a+a)) + + + + a