tefan Stncescu PARTEA I UTILITARE DE SISTEM CURSUL

  • Slides: 28
Download presentation
Ştefan Stăncescu PARTEA I UTILITARE DE SISTEM CURSUL 6 COMPILATOARE 1

Ştefan Stăncescu PARTEA I UTILITARE DE SISTEM CURSUL 6 COMPILATOARE 1

COMPILATOARE limbaj „de nivel înalt”, high level language HLL, respectă legile unei gramatici complexe,

COMPILATOARE limbaj „de nivel înalt”, high level language HLL, respectă legile unei gramatici complexe, apropiată de gramatica de limbaj uman HLL - intermediar între om – calculator limbaj uman – limbaj binar COMPILATOR – automat de traducere HLL – limbaj binar 2

COMPILATOARE Cod sursă – limbaj HLL Cod obiect – limbaj binar, (cod mașină) COMPILARE

COMPILATOARE Cod sursă – limbaj HLL Cod obiect – limbaj binar, (cod mașină) COMPILARE – cf. Legi de gramatică HLL • legi lexicale • Tip si structura elemente limbaj • legi sintactice • Reguli de compunere elemente limbaj • legi “semantice” • programe de traducere legi sintactice in cod obiect 3

COMPILATOARE La compilare, examinare text sursa in HLL • legi lexicale • scaner •

COMPILATOARE La compilare, examinare text sursa in HLL • legi lexicale • scaner • legi sintactice • parser • legi “semantice” • generator de cod obiect • (la masini virtuale – cod intermediar – “bytecod” 4

COMPILATOARE SCANER Descopera elementele de limbaj – token-uri (unul sau mm caractere contigui –

COMPILATOARE SCANER Descopera elementele de limbaj – token-uri (unul sau mm caractere contigui – neseparate prin caractere sp, LF, FF, etc. ) cuvinte START, STOP, LABEL 01 operatori +*/semne speciale (){}//. , 5

COMPILATOARE SCANER I pas scanare text sursa HLL determina tokenuri prin delimitare identifica tokenuri

COMPILATOARE SCANER I pas scanare text sursa HLL determina tokenuri prin delimitare identifica tokenuri de limbaj identifica token-uri inventate creeaza look-up tabel cu simboluri numerice token-uri 6

COMPILATOARE SCANER II pas scanare text sursa HLL creeaza fisier sursa intermediar cu token-urileinlocuite

COMPILATOARE SCANER II pas scanare text sursa HLL creeaza fisier sursa intermediar cu token-urileinlocuite cu simboluri numerice din look-up table pas I 7

COMPILATOARE REPREZENTAREA LEGI SINTACTICE BNF – Bachus-Naur Form O lege în format BNF =

COMPILATOARE REPREZENTAREA LEGI SINTACTICE BNF – Bachus-Naur Form O lege în format BNF = = o construcție validă in limbajul HLL = = un șablon de formare corectă a unei linii in fisier sursa HLL (si a regulilor de succesiune de linii) 8

COMPILATOARE Legea sintactică = construcție validă în HLL Un sablon respectat are nume al

COMPILATOARE Legea sintactică = construcție validă în HLL Un sablon respectat are nume al constructiei element verificat, care poate face parte înalte constructii (inclusiv una cu acelasi sablon) Construcția nouă = simbol neterminal <simbol neterminal>: : = construcție cu șablon 9

COMPILATOARE PARSARE = descoperire sabloane valide pâna cand nu mai sunt legi nedescoperite (FĂRĂ

COMPILATOARE PARSARE = descoperire sabloane valide pâna cand nu mai sunt legi nedescoperite (FĂRĂ SIMBOLURI NETERMINALE) PARSAREA se termina la token-uri Inlănțuirea de legi – sabloane – arbore sintactic Scopul parsării – descoperirea arborelui sintactic al fișierului sursă 10

COMPILATOARE Linie in fișierul sursă: S=A+B (A, B, S variabile intregi –token-uri) Generatorul de

COMPILATOARE Linie in fișierul sursă: S=A+B (A, B, S variabile intregi –token-uri) Generatorul de cod trebuie sa explice masinii operatia din sablon (A+B) Scanerul identifica “=“ “A” “+” “B” identifica tokenuri variabile A, B, S tokenul operator + tokenul atribuire = Verifica si consistenta sirului de token-uri 11

COMPILATOARE Verifică și coerența variabilelor, de aceasi fel daca A, B, S sunt întregi

COMPILATOARE Verifică și coerența variabilelor, de aceasi fel daca A, B, S sunt întregi - OK daca unul e diferit, - se comanda operatia de conversie la cel mai general Daca S real, A, B intregi la “=“ (atribuire) se adaugă o operatie de conversie format 12

COMPILATOARE I-a operație – coerența structurilor (conversie, daca e nevoie) II-a operație – A+B

COMPILATOARE I-a operație – coerența structurilor (conversie, daca e nevoie) II-a operație – A+B (rezultatul în mem temp) III-a operatie atribuirea la S rezultatului (S=A+B) Legi aplicate : conversie, adunare, atribuire, în aceasta ordine 13

COMPILATOARE EXEMPLUL II (parsarea de jos în sus J / S) S=A+B*C – D

COMPILATOARE EXEMPLUL II (parsarea de jos în sus J / S) S=A+B*C – D J / S : scanarea liniei cu descoperirea operatiilor de efectuat mai întâi rezultatul acestora devin simboluri neterminale <N> => Precedența operatorilor ( + <. * ) | ( *. > -) Legea sintactică a înmulțirii <produs>: : =<factor>*<factor> Legea sinactică a adunării <suma> : : =(<termen>+<termen>)|(<termen>-<termen>) 14

COMPILATOARE EXEMPLUL II (parsarea de jos în sus J / S) <N 1>: :

COMPILATOARE EXEMPLUL II (parsarea de jos în sus J / S) <N 1>: : =B*C <N 2>: : =A+N 1 <N 3>: : =N 2 -D Arborele sintactic al expresiei A+B*C-D 15

COMPILATOARE EXEMPLUL II (parsarea de sus în jos S  J) S=A+(B*C-D) S=ATTRIB(N 3)

COMPILATOARE EXEMPLUL II (parsarea de sus în jos S J) S=A+(B*C-D) S=ATTRIB(N 3) N 3=SUM(A, N 2) N 2=SCAD(N 1, D) N 1=PROD(B, C) Arborele sintactic al expresiei A+B*C-D (S J) 16

COMPILATOARE PROGRAM ETALON ÎN LIMBAJ PASCAL SIMPIFICAT 1 PROGRAM ANALIZA MEDII 2 VAR 3

COMPILATOARE PROGRAM ETALON ÎN LIMBAJ PASCAL SIMPIFICAT 1 PROGRAM ANALIZA MEDII 2 VAR 3 NRCRT, I: INTEGER; 3 SARITM, SARMON, DIF: REAL 4 BEGIN 5 SARITM : =0; 6 SARMON : =0; 7 FOR I 8 BEGIN : =0 TO 100 DO 9 READ (NRCRT); 10 SARITM : = SARITM + NRCRT; 11 SARMON : = SARMON + 1 DIV NRCRT; 12 END; 13 DIF : =SARITM DIV 100 – 100 DIV SARMON; 14 WRITE (DIF); 15 END. 17

COMPILATOARE GRAMATICA (BNF) LIMBAJ PASCAL SIMPIFICAT 1. <prog> : : = PROGRAM <prog-name> VAR

COMPILATOARE GRAMATICA (BNF) LIMBAJ PASCAL SIMPIFICAT 1. <prog> : : = PROGRAM <prog-name> VAR <dec-list> BEGIN <stmt-list> END. 2. <prog_name> : : = id 3. <dec_list> : : = <dec> | <dec_list> ; <dec> 4. <dec> : : = <id_list> : <type> 5. <type> : : = INTEGER | REAL 6. <id_list> : : = id | <id_list> , id 7. <stmt_list> : : = <stmt> | <stmst_list> ; <stmt> 8. <stmt> : : = <assign> | <read> | <write> | <for> 9. <assign> : : = id : = <exp> 10. <exp> : : = <term> | <exp> + <term> | <exp> - <term> 11. <term> : : = <factor> | <term> * <factor> | <term> DIV <factor> 12. <factor> : : = id | int | (<exp>) 13. <read> : : = READ(id_list) 14. <write> : : = WRITE(id_list) 15. <for> : : = FOR <index_exp> DO <body> ; 16. <index_exp> : : = id: = <exp> TO <exp> 17. <body> <stmt> | BEGIN <stmt_list> END : : = 18

COMPILATOARE Nume Token Cod PROGRAM 1 VAR 2 BEGIN 3 END. 4 END 5

COMPILATOARE Nume Token Cod PROGRAM 1 VAR 2 BEGIN 3 END. 4 END 5 INTEGER 6 REAL 7 READ 8 WRITE 9 FOR 10 TO 11 DO 12 ; 13 : 14 , 15 : = 16 + 17 - 18 DIV 19 ( 20 ) 21 ID INT 22 23 19

COMPILATOARE Fisier elaborat de scaner LINIE TOKEN 1 1 22 SPECIFICATOR ^ STATUS :

COMPILATOARE Fisier elaborat de scaner LINIE TOKEN 1 1 22 SPECIFICATOR ^ STATUS : 7 10 22 ^I 16 23 < >1 11 23 < >100 12 20

COMPILATOARE ETALON 9. READ (NRCRT); BNF: 13. 6. <read> : : =READ(id_list) <id_list> :

COMPILATOARE ETALON 9. READ (NRCRT); BNF: 13. 6. <read> : : =READ(id_list) <id_list> : : =id | <id_list>) ; id 21

COMPILATOARE ETALON 15. DIF : =SARITM DIV 100 – 100 DIV SARMON; BNF: 9.

COMPILATOARE ETALON 15. DIF : =SARITM DIV 100 – 100 DIV SARMON; BNF: 9. <assign> : : = id : = <exp> 10. <exp> : : = <term> | <exp> - <term> 11. <term> : : = <factor> | <term> DIV <factor> 12. <factor> : : = id | int| (<exp>) 22

COMPILATOARE 23

COMPILATOARE 23

PROG RAM . =. VAR INT ID ) ( DIV - + : =

PROG RAM . =. VAR INT ID ) ( DIV - + : = , : ; DO TO FOR WRITE READ REAL INTEG ER END. BEGIN VAR PROG RAM COMPILATOARE <. . =. BEGIN <. . =. . > <. <. END INTEG ER REAL . > . > . > READ . =. WRITE . =. FOR . =. TO <. . > DO ; <. . > . > : <. <. <. , . =. : = + DIV . > . =. . > <. <. . > . > <. ( <. ) ID INT <. . > . > . > . =. <. <. . > <. <. <. . =. <. . > . > . > 24

COMPILATOARE PROGRAM. =. VAR BEGIN <. FOR ; . > END. Perechi vide –

COMPILATOARE PROGRAM. =. VAR BEGIN <. FOR ; . > END. Perechi vide – erori gramaticale Relatiile de precedență – UNICE (coerența regulilor gramaticale) 25

COMPILATOARE Generarea programelor semantice (J / S) DIF : = SARITM DIV 100 –

COMPILATOARE Generarea programelor semantice (J / S) DIF : = SARITM DIV 100 – 100 DIV SARMON id 1 : = int - id 4 id 1 : = id 2 DIV exp 1 - int DIV exp 2 exp 3 DIV SARITM #100 i 1 DIV #100 SARMON i 2 - i 1 i 2 i 3 : = i 4 , DIF 26

COMPILATOARE (1) : = #0 , SARITM {SARITM: =0} (2) : = #0 ,

COMPILATOARE (1) : = #0 , SARITM {SARITM: =0} (2) : = #0 , SARMON {SARMON: =0} (3) : = #1 , I {FOR i=1 to 100} (4) JGT I #100 (15) (5) CALL X READ (6) PARAM NRCRT (7) + SARITM NRCRT i 1 (8) : = i 1 , SARITM (9) DIV #1 NRCRT i 2 (10) + SARMON i 2 i 3 (11) : = i 3 , SARMON (12) + I #1 i 4 (13) : = i 4 , I (15) DIV SARITM #100 i 6 (16) DIV #100 SARMON i 7 (17) - i 6 i 7 i 8 (18) : = i 8 , (19) CALL X WRITE {READ(NRCRT)} {SARITM: =SARITM+NRCRT} {SARMON: =SARMON+1 DIV NRCRT) {sfîrşit FOR} (14) J (4) (20) PARAM DIF {DIF : =SARITM DIV 100 - 100 DIV SARMON} DIF 27

COMPILATOARE 1. L. L. Beck, „System Software: An introduction to systems programming”, Addison Wesley.

COMPILATOARE 1. L. L. Beck, „System Software: An introduction to systems programming”, Addison Wesley. 3’rd edition, 1997. 2. A. V. Aho, M. S. Lam, R. Sethi, and J. D. Ullman, „Compilers: Principles, Techniques, and Tools”, 2'nd Edition. Addison-Wesley, 2007 3. Wirth Niklaus ""Compiler Construction", Addison-Wesley, 1996, 176 pages. Revised November 2005 4. Knuth, Donald E. "Backus Normal Form vs. Backus Naur Form", Communications of the ACM 7 (12), 1964, p 735– 736. 28