Semantiline analüüs. Süntaksipuu dekoreeritakse tüübi- ja muu kontekstist sõltuva

Σχετικά έγγραφα
Kirjeldab kuidas toimub programmide täitmine Tähendus spetsifitseeritakse olekuteisendussüsteemi abil Loomulik semantika

Lokaalsed ekstreemumid

ITI 0041 Loogika arvutiteaduses Sügis 2005 / Tarmo Uustalu Loeng 4 PREDIKAATLOOGIKA

T~oestatavalt korrektne transleerimine

MATEMAATIKA TÄIENDUSÕPE MÕISTED, VALEMID, NÄITED LEA PALLAS XII OSA

Υλοποίηση ΣΑ με το bison

Υλοποίηση ΣΑ με το bison

Funktsiooni diferentsiaal

Παρουσίαση του εργαλείου BISON

HAPE-ALUS TASAKAAL. Teema nr 2

Geomeetrilised vektorid

Graafiteooria üldmõisteid. Graaf G ( X, A ) Tippude hulk: X={ x 1, x 2,.., x n } Servade (kaarte) hulk: A={ a 1, a 2,.., a m } Orienteeritud graafid

Μεταγλωττιστές. Εργαστήριο 5. Εισαγωγή στο BISON. Γεννήτρια Συντακτικών Αναλυτών. 2 η Φάση Μεταγλώττισης Συντακτική Ανάλυση

Kontekstivabad keeled

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Γλώσσες Προγραμματισμού Μεταγλωττιστές. Συντακτική Ανάλυση με το Εργαλείο BISON

Εργαστήριο 08 Εισαγωγή στo Yacc

Vektorid II. Analüütiline geomeetria 3D Modelleerimise ja visualiseerimise erialale

MATEMAATIKA TÄIENDUSÕPE MÕISTED, VALEMID, NÄITED, ÜLESANDED LEA PALLAS VII OSA

Kompleksarvu algebraline kuju

9. AM ja FM detektorid

4.2.5 Täiustatud meetod tuletõkestusvõime määramiseks

Matemaatiline analüüs I iseseisvad ülesanded

Θα χρησιμοποιήσουμε το bison, μια βελτιωμένη έκδοση του yacc. Φροντιστήριο 2ο Εισαγωγή στο YACC. Yacc. Δομή Προγράμματος Yacc

HY340, 2010 Α. Σαββίδης. Slide 3 / 43. Slide 4 / 43

PLASTSED DEFORMATSIOONID

Matemaatiline analüüs I iseseisvad ülesanded

Τι είναι το yacc. Δομή ενός αρχείου yacc. Πρόλογος. ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο. Ο yacc είναι ένας γενικού σκοπού parser generator.

Παρουσίαση του εργαλείου BISON

Punktide jaotus: kodutööd 15, nädalatestid 5, kontrolltööd 20+20, eksam 40, lisapunktid Kontrolltööd sisaldavad ka testile vastamist

Funktsioonide õpetamisest põhikooli matemaatikakursuses

1 Funktsioon, piirväärtus, pidevus

Ruumilise jõusüsteemi taandamine lihtsaimale kujule

Jätkusuutlikud isolatsioonilahendused. U-arvude koondtabel. VÄLISSEIN - COLUMBIA TÄISVALATUD ÕÕNESPLOKK 190 mm + SOOJUSTUS + KROHV

Ehitusmehaanika harjutus

Εισαγωγή στο Flex. Μεταγλωττιστές, Χειμερινό εξάμηνο

Kontekstivabad keeled

HSM TT 1578 EST EE (04.08) RBLV /G

Το μεταεργαλείο yacc. Διαδικασία χρήσης. Αρχείο εισόδου

Sisukord. 2 Programmeerimiskeel C

Lexical-Functional Grammar

Planeedi Maa kaardistamine G O R. Planeedi Maa kõige lihtsamaks mudeliks on kera. Joon 1

,millest avaldub 21) 23)

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην εξοικείωση με τη διαδικασία κατασκευής ενός Λεξικού Αναλυτή κάνοντας χρήση του lex.

Vektoralgebra seisukohalt võib ka selle võrduse kirja panna skalaarkorrutise

7.7 Hii-ruut test 7.7. HII-RUUT TEST 85

Formaalsete keelte teooria. Mati Pentus

Compress 6000 LW Bosch Compress LW C 35 C A ++ A + A B C D E F G. db kw kw /2013

Arvuteooria. Diskreetse matemaatika elemendid. Sügis 2008

Εργαστήριο 4_1 Λεκτική Ανάλυση - Flex Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Suhteline salajasus. Peeter Laud. Tartu Ülikool. peeter TTÜ, p.1/27

Εργαστήριο 08 Δημιουργία 1 ου Συντακτικού Αναλυτή

2.2.1 Geomeetriline interpretatsioon

Mathcadi tööleht ja vormistamisvahendid

HULGATEOORIA ELEMENTE

Mathematica kasutamine

6.6 Ühtlaselt koormatud plaatide lihtsamad

Eesti koolinoorte XLVIII täppisteaduste olümpiaadi

Eesti koolinoorte 43. keemiaolümpiaad

Παρουσίαση του εργαλείου. flex. γεννήτρια λεκτικών αναλυτών. για το µάθηµα: Μεταγλωττιστές. Χανιά, flex 1

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΛΟΠΟΝΝΗΣΟΥ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ. Α.Μ

Sõiduki tehnonõuded ja varustus peavad vastama järgmistele nõuetele: Grupp 1 Varustus

Διάλεξη 22η: Επιπλέον στοιχεία της C

MATEMAATILISEST LOOGIKAST (Lausearvutus)

STM A ++ A + A B C D E F G A B C D E F G. kw kw /2013

Lexical-Functional Grammar

2. HULGATEOORIA ELEMENTE

ALGEBRA I. Kevad Lektor: Valdis Laan

Lambda-arvutus. λ-termide süntaks. Näiteid λ-termidest. Sulgudest hoidumine. E ::= V muutuja (E 1 E 2 ) aplikatsioon (λv.

TTÜ informaatikainstituut. Tutvumine Pythoniga

KATEGOORIATEOORIA. Kevad 2010

SORTEERIMINE JA FILTREERIMINE

1 Reaalarvud ja kompleksarvud Reaalarvud Kompleksarvud Kompleksarvu algebraline kuju... 5

Keerukusteooria elemente

Kehade soojendamisel või jahutamisel võib keha minna ühest agregaatolekust teise. Selliseid üleminekuid nimetatakse faasisiireteks.

sin 2 α + cos 2 sin cos cos 2α = cos² - sin² tan 2α =

2017/2018. õa keemiaolümpiaadi piirkonnavooru lahendused klass

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

Deformatsioon ja olekuvõrrandid

Προγραμματισμός Ι (HY120)

Υλοποίηση ΛΑ με το flex

Smith i diagramm. Peegeldustegur

NÄIDE KODUTÖÖ TALLINNA TEHNIKAÜLIKOOL. Elektriajamite ja jõuelektroonika instituut. AAR0030 Sissejuhatus robotitehnikasse

KATEGOORIATEOORIA. Kevad 2016

KORDAMINE RIIGIEKSAMIKS V teema Vektor. Joone võrrandid.

Andmeanalüüs molekulaarbioloogias

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

4.1 Funktsiooni lähendamine. Taylori polünoom.

Aritmeetilised ja loogilised operaatorid. Vektor- ja maatriksoperaatorid

YMM3740 Matemaatilne analüüs II

TTÜ informaatikainstituut. Tutvumine Pythoniga

KORDAMINE RIIGIEKSAMIKS VII teema Vektor. Joone võrrandid.

1 Kompleksarvud Imaginaararvud Praktiline väärtus Kõige ilusam valem? Kompleksarvu erinevad kujud...

Εισαγωγή στον Προγραμματισμό

Tuletis ja diferentsiaal

28. Sirgvoolu, solenoidi ja toroidi magnetinduktsiooni arvutamine koguvooluseaduse abil.

Παρουσίαση του εργαλείου FLEX

Ülesanne 4.1. Õhukese raudbetoonist gravitatsioontugiseina arvutus

Transcript:

Semantiline analüüs

Semantiline analüüs Semantiline analüüs kontrollib programmi kontekstuaalsete sõltuvuste korrektsust: leiab vastavuse defineerivate ja kasutusesinemiste vahel, leiab esinemiste tüübid ja kontrollib nende vastavust reeglitele,... Süntaksipuu dekoreeritakse tüübi- ja muu kontekstist sõltuva infoga.

Semantiline analüüs Semantiline analüüs tegeleb staatilise semantika poolt pandud kitsenduste kontrollimisega. Mõnikord on nende kontrollimine osaliselt saavutatav ka kontekstivabade grammatikatega, aga reeglina muudab see grammatika loetamatuks või kitsendab keelt väga tugevalt. Näide lihtsalt tüübitud avaldised: IntExp int intvar IntExp + IntExp oolexp true false boolvar IntExp IntExp not oolexp oolexp & oolexp

Semantiline analüüs Toodud grammatika tundub esmapilgul igati mõistlik, aga: kogu skeem baseerub tugevalt sellel, et muutujad on eraldatud kahte klassi täisarvulised- ning tõeväärtusmuutujad; rohkemate tüüpide korral tuleb ka muutujahulki rohkem tükeldada; samas, enamik programmeerimiskeeli lubab ei sea muutujanimedele tüübi järgi kitsendusi; veelgi enam, reeglina on lubatud erinevas kontekstis kasutada sama nime erinevat tüüpi muutujate tähistamiseks.

Atribuutgrammatika (attribute grammar) on kontekstivaba grammatika üldistus, kus: iga grammatika sümboliga on seotud mingi hulk atribuute; iga produktsioonireegliga on seotud vastavate atribuutide arvutamise reeglid (nn. semantilised reeglid). Eesmärk on iga süntaksipuu korral leida semantiliste reeglitega kooskõlas olev atribuutide väärtustus.

Näide: Produktsioonid Semantilised reeglid N S.pos := 0 N.val := S.neg.val S + S.neg := 1 S S.neg := 1 1 1.pos :=.pos + 1.pos :=.pos.val := 1.val +.val.pos :=.pos.val :=.val 0.val := 0 1.val := 2.pos

Näide: N val = 5 val = 5 S neg = 1 val = 0 val = 1 1 0 1

Produktsiooniga A α seotud semantilised reeglid on kujul y = f (x 1,..., x n ), kus y ja x i on mingile grammatika sümbolile kuuluvad atribuudid ning f on funktsioon. Eristatakse kahte liiki atribuute: sünteesitud (synthesized) atribuudid: y on sümboli A atribuut; päritud (inherited) atribuudid: y on mingi produktsioonireegli parempooles α esineva sümboli atribuut. Sünteesitud atribuutide väärtused sõltuvad ainult otseste alampuude juurtippude atribuutide väärtustest. Päritud atribuutide väärtused sõltuvad vahetu ülemtipu ning kõrvaltippude atribuutide väärtustest.

Näide: Produktsioonid Semantilised reeglid N S.pos := 0 N.val := S.neg.val S + S.neg := 1 S S.neg := 1 1 1.pos :=.pos + 1.pos :=.pos.val := 1.val +.val.pos :=.pos.val :=.val 0.val := 0 1.val := 2.pos sünteesitud atribuudid päritud atribuudid

Kui atribuudi a väärtuse arvutamiseks on tarvis atribuudi b väärtust (a sõltub b-st), siis tuleb b väärtustada enne kui a. Atribuutide vahelised sõltuvused defineerivad atribuutide väärtustamiseks sõltuvusgraafi (dependency graph): suunatud graaf, kus servad näitavad atribuutide vahelisi sõltuvusi; kirjeldab andmete voogu atribuutide väärtustamisel. Sünteesitud atribuutide korral on servad suunatud alt üles. Päritud atribuutide korral on servad suunatud ülalt alla ja/või vasakult paremale ning paremalt vasakule.

Näide: N val = 5 sõltuvusgraaf S neg = 1 val = 5 sünteesitud atribuudid päritud atribuudid val = 0 val = 1 1 0 1

Näide: N val = 5 sõltuvusgraaf S neg = 1 val = 5 sünteesitud atribuudid päritud atribuudid val = 0 val = 1 1 0 1

Näide: N val = 5 sõltuvusgraaf S neg = 1 val = 5 sünteesitud atribuudid päritud atribuudid val = 0 val = 1 1 0 1

Näide: N val = 5 sõltuvusgraaf S neg = 1 val = 5 sünteesitud atribuudid päritud atribuudid val = 0 val = 1 1 0 1

Näide: N val = 5 sõltuvusgraaf S neg = 1 val = 5 sünteesitud atribuudid päritud atribuudid val = 0 val = 1 1 0 1

Tsükliteta suunatud graafi topoloogiliseks sorteerimiseks nimetatakse graafi tippudel n 1,..., n k sellise järjestuse leidmist, et iga kaare n i n j korral n i < n j. Sõltuvusgraafi topoloogiline sorteerimine annab kehtiva järjestuse atribuutide väärtustamiseks. N! Üldjuhul saab väärtustada ainult mittetsüklilisi semantilisi reegleid.

Näide: N val = 5 val = 5 S neg = 1 val = 0 val = 1 1 0 1

Näide: 12 N val = 5 11 val = 5 2 S neg = 1 8 5 4 7 val = 0 10 val = 1 1 3 1 6 0 9 1

S-atribuutgrammatika on selline AG, kus kõik atribuudid on sünteesitud. Kuna atribuutide väärtustamine toimub alt üles, siis on S-atribuutgrammatikad sobilikud kasutamiseks koos R(k) parseritega. Atribuutide väärtused saab koos sümboliga salvestada magasini. Kui toimub produktsioonireegli A α taandamine, siis on tema parempoole α atribuudid magasini tipus. Seega saab taandamise ajal ka arvutada lisatava tipu sünteesitavad atribuudid.

-atribuutgrammatika on selline AG, kus iga produktsioonireegli A X 1 X 2... X n korral, sümboli X i (1 i n) kõik päritavad atribuudid sõltuvad ainult A päritavatest atribuutidest ning temast vasakul asuvate sümbolite X j (j < i) atribuutidest. N! Iga S-atribuutgrammatika on ka -atribuutgrammatika. -atribuutgrammatikate korral saab atribuute väärtustada sügavuti vasakult-paremale järjekorras. Sobilikud kasutamiseks koos (k) parseritega (nii rekursiivselt laskuvate kui tabeljuhitavatega).

Parserite generaator ison foo.l flex lex.yy.c file.foo yylex() gcc a.out foo.y bison y.tab.c file.exe

Parserite generaator ison Sisendfaili formaat: ison-i sisendfail koosneb kolmest osast: definitions %% rules %% user code Sama üldstruktuur mis Flex-il.

Parserite generaator ison %{ #include <stdio.h> %} %token INTEGER %% program: program expr \n { printf("%d\n", $2); } ; expr: INTEGER { $$ = $1; } expr + expr { $$ = $1 + $3; } expr - expr { $$ = $1 - $3; } ; %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main(void) { yyparse(); return 0; }

Parserite generaator ison %{ #include <stdio.h> %} %token INTEGER %% Definitsioonide osa koosneb: %{ ja %} vahel asuv C kood, mis kopeeritakse otse genereeritavasse faili; ison-i deklaratsioonid: %token terminaalsümbolite loend (tarvilikud nii produktsioonireeglites, kui skanneris); %start algsümboli määramine (kui puudub, siis on algsümboliks esimene mitteterminal); %union, %left, %right,...

Parserite generaator ison program: program expr \n { printf("%d\n", $2); } ; expr: INTEGER { $$ = $1; } expr + expr { $$ = $1 + $3; } expr - expr { $$ = $1 - $3; } ; Teine osa koosneb produktsioonireeglitest. Peab olema defineeritud vähemalt üks produktsioonireegel. Reeglite parempooled koosnevad terminalidest ja mitteterminalidest ning võivad sisaldada aktsioone. Mitteterminalid võivad olla nii eelnevalt deklareeritud, kui ka üksikmärgid (mida pole vaja eeldeklareerida).

Parserite generaator ison program: program expr \n { printf("%d\n", $2); } ; expr: INTEGER { $$ = $1; } expr + expr { $$ = $1 + $3; } expr - expr { $$ = $1 - $3; } ; Aktsioonid on loogeliste sulgudega ümbritsetud C kood. Vastavad semantilistele reeglitele. Võivad viidata grammatika sümbolitega seotud semantilistele väärtustele (sünteesitud atribuutidele): $$ vastab vasakpoole väärtusele; $1 vastab parempoole esimese sümboli väärtusele;...

Parserite generaator ison program: program expr \n { printf("%d\n", $2); } ; expr: INTEGER { $$ = $1; } expr + expr { $$ = $1 + $3; } expr - expr { $$ = $1 - $3; } ; Aktsioonid asuvad enamasti parempoole lõpus ning nende täitmine toimub produktsioonireegli taandamisel. Võib olla ka sümbolite vahel, misjuhul on see samaväärne lisa mitteterminaliga, mille prempool koosneb antud aktsioonist (ja on muidu tühi). Kui aktsioon puudub, siis vaikimisi aktsiooniks on {$$ = $1;}

Parserite generaator ison %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main(void) { yyparse(); return 0; } Sisendfaili kolmas osa koosneb C koodist, mis kopeeritakse genereeritavasse faili ilma ühegi muutuseta. Olulisemad funktsioonid: main() kutsub välja yyparse(); yyerror() raporteerib süntaksi vigadest; yylex() tunneb ära mitteterminalid (reeglina defineeritud Flex-i abil). Kolmas osa võib puududa, millisel juhul võib ka teise eraldusrea ära jätta.

Parserite generaator ison Funktsioon yyparse() kasutab uue lekseemi saamiseks funktsiooni yylex(). Skanneri ja parseri suhtlusliides on spetsifitseeritud ison-is: mitteterminalid on deklareeritakse direktiiviga %token; ühemärgilised mitteterminalid võivad olla deklareerimata; funktsiooni yylex() väljundväärtuseks on kas deklareeritud mitteterminal või üksik märk. Kompileerimiseks tuleb skannerisse kaasata päisfail "*.tab.h" genereerikas ison-i poolt andes argumendiks võtme -d. Alternatiivselt võib parseri spetsifikatsioonifaili kolmads osas kaasata skanneri fail "lex.yy.c".

Parserite generaator ison Mitteterminalide atribuutväärtus antakse edasi muutujas yylval. Atribuudid on tüüpi YYSTYPE, mis vaikimisi on tüüp int. Erinevatele sümbolitele erinevat tüüpi atribuutide määramiseks tuleb: kõik tüübid spetsifitseerida direktiiviga %union %union { type1 name1; type2 name2;... } määrata terminalide ja mitteterminalide tüübid %token <name> TOKEN %type <name> non-terminal Skanneris terminalsümbolile vastava atribuutväärtuse omistamiseks tuleb viidata vastavat tüüpi ühendiväljale (yylval.name).

Parserite generaator ison Shift-reduce aktsioonide otsustamiseks kasutatakse ühe sümboli ettevaatamist. Konfliktid lahendatakse prioriteedireeglite ja vaikimisi reeglite abil: direktiivid %left, %right ja %nonassoc määravad sümboli assotsiatiivsuse ning prioriteedi; prioriteet on antud kaudselt direktiivide tekstuaalse järjekorraga (mida hilisem seda suurema prioriteediga); reegli prioriteet on sama, mis tema parempoole viimasel mitteterminalil (võib ilmutatult muuta kasutades direktiivi %prec); shift/reduce konflikti korral eelistatakse vaikimisi nihutamist; reduce/reduce konflikti korral eelistatakse vaikimisi esimest reeglit.