ITIS Negrelli — Feltre (BL)

Analizzatore grammaticale

Parser di un'espressione aritmetica

Classe VAinf — 2007/08

Anali...
Analizzatore grammaticale

Espressione è Espressione Operatore Espressione |  (Espressione) |  Numero
Numero -) Cifra |  C...
2*3+4=1O

Espressione 9 Espressione Operatore Espressione |  (Espressione) |  Numero
Numero 9 Cifra |  Cifra Numero
Operat...
2Ìì*î

14

Espressione 9 Espressione Operatore Espressione |  (Espressione) |  Numero

Numero 9 Cifra |  Cifra Numero , 
O...
2+3*4 14

Espressione 9 Numero Operatore Espressione |  (Espressione) |  Numero
Numero 9 Cifra |  Cifra Numero
Operatore 9...
2*3Ìî= l_O

Espressione 9 Numero Operatore Espressione |  (Espressione) |  Numero

Numero 9 Cifra |  Cifra Numero , 
Opera...
2-l-3*4

14

Espressione 9 Termine OperatoreAddittivo Espressione |  Termine
Termine 9 Fattore OperatoreMoltiplicativo Ter...
2*3-l— = 

4 LO

Espressione 9 Termine OperatoreAddittivo Espressione |  Termine
Termine 9 Fattore OperatoreMoltiplicativo...
2+3*(4*(5+6))= l34

Espressione 9 Termine OperatoreAddittivo Espressione |  Termine
Termine 9 Fattore OperatoreMoltiplicat...
Analizzatore grsîacckia — m3 Negrelli 2oo7roa — Giuseppe Ricci.  Luigino Calvi - 1o
Il programma

UsaVaI. c test delle funzioni
Valuta. c funzioni per l‘analisi

— float valuta (char*) funzione pubblica che...
UsaVaI. c

ìinclude <stdio .  h)
fiinclude "va1uta. h"

int minunt argmchar *argv[])
l
char espi] =  "LD+2‘(3+(1))"; 
float...
Valuta. c

[kit
* funzione pubblica che valuta il valore dell'espressione csp; 
* si assume che esp sia un'espressione num...
Valuta. c

Espressione 9 Termine OperatoreAddittivo Espressione |  Termine

 w «a

‘ acquisizione di : n'espressione

* il...
Valuta. c

Termine 9 Fattore OperatoreMoltiplicativo Termine |  Fattore

f ‘Ir i: 
‘ acquisizione di un termine
static voi...
Valuta. c

Fattore 9 (Espressione) |  Numero

l. ’ dr ‘k
* acquisizione di un fattore
* il valore acquisito viene deposita...
Valuta. c

/ / esegue il calcolo sui due operandi in cima allo stack, 

/ / in base all'operatore t,  lasciando il risulta...
Scannenc

àdetine BUF SIZE 412 / / dimensione del nufter di memorizzazione
stazic char _put[_pur_s1zs1; / / buffer

static...
Tokenize. c

TokenType getToken(const chaz ‘s,  char **ps,  float *pf)

1
TokenType L =  FINE; 

‘pf — 0.3;
‘p3 — (Char *)...
Stack. h

fiifndef _STACK_H
Melina _STACK_H

ma!  Booi
Mulino Bool int
Iflendif

lfifndef STACKTYPE
ladine STACKTYPE flod
flend...
Stack. c

/ /* Costruttore di default:  crea uno stack vuoto
void 3tackIn1t(T8tack *stack)
l
stack->sp - -1; / / equivalen...
Esercizi (per casa)

1. Testare ll codice consegnato
3. Estensione del parser 1
1, Introdurre l'operatore " POTENZA :  pow...
Esercizi (per casa)

1. Estensione dcl parscr 2
1, Attribuìre all'operatore POTENZA una priorità maggiore di quella data a...
Esercizi (per casa)

1. Estensione del parser 3
1. Introdurre la produzione descritta sotto
2. verificarne il funzionament...
ITIS Negrelli — Feltre (BL)

Analizzatore grammaticale

Parser di un’espressione aritmetica

Fine

Analizzatore grammatica...
Upcoming SlideShare
Loading in...5
×

Lezione Analizzatore Lessicale

1,630

Published on

Lezione sull'analisi di una grammatica (ITIS Negrelli A.S. 2007/08)

Published in: Technology, Travel
1 Comment
0 Likes
Statistics
Notes
  • Download doesn't work<br /><br/>
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total Views
1,630
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
63
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Lezione Analizzatore Lessicale

  1. 1. ITIS Negrelli — Feltre (BL) Analizzatore grammaticale Parser di un'espressione aritmetica Classe VAinf — 2007/08 Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 1
  2. 2. Analizzatore grammaticale Espressione è Espressione Operatore Espressione | (Espressione) | Numero Numero -) Cifra | Cifra Numero Operatore 9 + | -| * | / Cifra->0|1|2|3|4|5|6|7|8|9|0 2+3*(4+5*6)i 2+3w1> 2+3*(34) 2+102 104 Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 2
  3. 3. 2*3+4=1O Espressione 9 Espressione Operatore Espressione | (Espressione) | Numero Numero 9 Cifra | Cifra Numero Operatore 9 + | -| * | / Cifra90|1|2|3|4|5|6|7|8|9|0 10 "i Esatto Z E A xx/ 6 4*”: f‘ il E o eeeeeee Z l + 4 52% t i3 N N o N l l 4 i AAAAAA « c ‘j i3 2: C C" Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 3
  4. 4. 2Ìì*î 14 Espressione 9 Espressione Operatore Espressione | (Espressione) | Numero Numero 9 Cifra | Cifra Numero , Operatore 9 + | -| * | / ‘ A Cifra90|1|2|3|4|5|6|7|8|9|0 20') -". -r= u Q x E A b‘ ‘ 5 4*”: f‘ il E O eeeeeee Z l * 4 g 2 % t 3 N N O N i l C c c 34: 2 2 3 i l Analizzatore grammaticale — ITlS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 4
  5. 5. 2+3*4 14 Espressione 9 Numero Operatore Espressione | (Espressione) | Numero Numero 9 Cifra | Cifra Numero Operatore 9 + | -| * | / Cifra90|1|2|3|4|5|6|7|8|9|0 14 "i Esatto Z E A / ’/î/ . N O / + / i. — N o E 4° / 3* 4 É i c 3 . ... ... .. N . 4 Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 5
  6. 6. 2*3Ìî= l_O Espressione 9 Numero Operatore Espressione | (Espressione) | Numero Numero 9 Cifra | Cifra Numero , Operatore 9 + | -| * | / ‘ A Cifra90|1|2|3|4|5|6|7|8|9|0 14 ‘i www- Q x E A b‘ ‘ x/ ‘lî/ r N O / ‘i ‘/ i . — N o E c * , i / 3 + 4 3 . ... ... .. 4 r , . 4 i Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 6
  7. 7. 2-l-3*4 14 Espressione 9 Termine OperatoreAddittivo Espressione | Termine Termine 9 Fattore OperatoreMoltiplicativo Termine | Fattore Fattore 9 (Espressione) | Numero - Numero 9 Cifra | Cifra Numero OperatoreAdditivo 9 + | - (14 i Esatto OperatoreMoltiplicativo 9 * | / * * Cifra90|1|2|3|4|5|6|7|8|9|0uggggg< E ’ _ . i = /l_ 12x i2 o (T moA E 2 / + ‘ ‘ F T 12 2 g/ r F OM T îmgc j i, . Î2 3 N Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 7
  8. 8. 2*3-l— = 4 LO Espressione 9 Termine OperatoreAddittivo Espressione | Termine Termine 9 Fattore OperatoreMoltiplicativo Termine | Fattore Fattore 9 (Espressione) | Numero - Numero 9 Cifra | Cifra Numero OperatoreAdditivo 9 + | - g10— i Esatto OperatoreMoltiplicativo 9 * | / * * Cifra90|1|2|3|4|5|6|7|8|9|0uggggg< E _ i n/ i. — e (T 0M. E 2 / l + . _ 2 K F (Oli/ l T 3 T . i * , N i F ' F a . . C ì i _ 4 2 i l N Analizzatore grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - B i 3 Î
  9. 9. 2+3*(4*(5+6))= l34 Espressione 9 Termine OperatoreAddittivo Espressione | Termine Termine 9 Fattore OperatoreMoltiplicativo Termine | Fattore Fattore 9 (Espressione) | Numero Numero 9 Cifra | Cifra Numero OperatoreAdditivo 9 + | - OperatoreMoltiplicativo 9 * | / Cifra90|1|2|3|4|5|6|7|8|9|0 Costruire l'albero dell'espressione Fermarsi a Numero senza arrivare a Cifra, evidenziando il contenuto dello stack tempo: 7 minuti Analizzakote grammaticale — ITIS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 9
  10. 10. Analizzatore grsîacckia — m3 Negrelli 2oo7roa — Giuseppe Ricci. Luigino Calvi - 1o
  11. 11. Il programma UsaVaI. c test delle funzioni Valuta. c funzioni per l‘analisi — float valuta (char*) funzione pubblica che valuta un ‘espressione — void calcola(TokenType) esegue il calcolo tra idue operandi nello stack — void espressione () produzione Espressione — void termine () produzione Termine — void fattore () produzione Fattore Stack. c funzioni per la gestione dello stack — void StackPush (Tstack*. float) inserisce un valore nella cima dello stack — void StackPop (TStack*) elimina il valore in cima allo stack — float StackTop (Tstack) restituisce il valore in cima allo stack — Booi Stack| sEmpty (TStack) TRUE se lo stack è vuoto Scanner. c interfaccia verso Tokenize, gestione del token — void setScanner (char') imposta la stringa da analizzare e richiama getToken — Void scanToken () avanza al prossimo token — TokenType curToken () restituisce il token corrente — float curvalue () restituisce il valore numerico corrente Tokenize. c - getToken restituisce il token ed eventualmente il valore Analizzatore grammaticale — ITIS Negrelli 2007/‘08 — Giuseppe Ricci, Luigino Calvi - 1 1
  12. 12. UsaVaI. c ìinclude <stdio . h) fiinclude "va1uta. h" int minunt argmchar *argv[]) l char espi] = "LD+2‘(3+(1))"; float ris = valutahsp); prìntt("Risulta: o di "%s"= %rn", esp, r1s); qctch (J ; return O; Analizzatore grammaticale - ITIS Negrelli 2007/08 — Giuseppe Ricci. Luigino Calvi - 12
  13. 13. Valuta. c [kit * funzione pubblica che valuta il valore dell'espressione csp; * si assume che esp sia un'espressione numerica in notazione * algebrica con operatori binari infissi e sintatticamente corretta */ float valutatchar *osp) l setscanneriespl; // imposta la stringa da valutare espressione(): return S: ackTop(s); Arlalizzatore grammaticale — ITIS Negrelli 2007/08 - Giuseppe Ricci, Luigino Calvi - 13
  14. 14. Valuta. c Espressione 9 Termine OperatoreAddittivo Espressione | Termine w «a ‘ acquisizione di : n'espressione * il valore dell'espressione acquisita viene depositato ix cima allo stack il static void espressione() l TokenType : ; termine(); t= curToKen(); while (((t= =PIU)| |(t= =MENO)) i sCanToKe: (); ii salta il token PIU/ MENG termine(); calcolalt); t= curToken(); l l Analizzatore grammaticale — ITlS Negrelli 2007/‘08 — Giuseppe Ricci, Luigino Calvi - 14
  15. 15. Valuta. c Termine 9 Fattore OperatoreMoltiplicativo Termine | Fattore f ‘Ir i: ‘ acquisizione di un termine static void termine() l ToxenType : ; fattore(); t curTokc: (); while ((t= =PER)| |(t= =DIVISO)) i scanToKe: (); li salta il token P3RfDIVISO fattore(); calcola(t); t= CurToxen(}; l Analizzatore grammaticale — ITlS Negrelli 2007/‘08 — Giuseppe Ricci, Luigino Calvi - 15
  16. 16. Valuta. c Fattore 9 (Espressione) | Numero l. ’ dr ‘k * acquisizione di un fattore * il valore acquisito viene depositato in cima allo stack 4: static void fattore() l if (curToken()= =NUMERO) l StackPush(&stack, Cgrvaluelll: il metti nello 3ÎaCi il valore 5canTokcn(); ii salta il NUMERO l else if (curToken()= =APERTA) l 5canTokcn(); ii passa al tokcì che segue APERTA espressione(); scanToxen(); /E passa al token che segue CHIUSA l l Analizzatore grammaticale — ITlS Negrelli 2007/‘08 — Giuseppe Ricci, Luigino Calvi - 16
  17. 17. Valuta. c / / esegue il calcolo sui due operandi in cima allo stack, / / in base all'operatore t, lasciando il risultato in cima allo stack static void calcolatrokonrypo t) { float x1,x2,ris; xl = StackTop(stack): // assegna a xl il valore in cima allo stack StackPopl&stack): // elimina il valore in cima allo stack x2 = StackTop(stack); // assegna a x2 il valore in cima allo stack StackPop(&stack); // elimina il valore in cima allo stack switch (t) { case PIU: rìs= x2+x1; break; case MENO: ris= x2-xl; break; case PER: ris= x2*x1; break; case DIVISO: rìs= x2/x1; break; default: break; } StackPush(&stack, ris); // metti il risultato nello stack Analizzatore gammaticala - ITIS Negrelli 2007/08 - Giuseppa Ricci, Luigino Calvi - 17
  18. 18. Scannenc àdetine BUF SIZE 412 / / dimensione del nufter di memorizzazione stazic char _put[_pur_s1zs1; / / buffer static Tokcnîypc _pur_tok0n; // tipo de; Lokcn cor: cnLc static float _pur_y| lu0; / / valore del token corrente sLaLic char '_ptbui = buf; // punLa1ore al prossimo ca1aLLe: e da analizzare / / imposta la stringa nelLo scanner void setscanner(cha: *s) I st: cpy( but, s): _cur_token - gotTokon(_ptbu! , 6_ptbu! , I_pu; _vn1uo); / / tipo de; Lokcn corzcnte (senza avanzare) Tokcnîypo cu: Token() I return _cur_token; / / va; or0 del token corrente (senza avanzamento) float curVa1ue() ( return cur value; / / avanzamento sul il prossimo token void scanTokon() { _cur_token — getTokcn(_p: buf, &_ptbuf, &_cur_value); ì Artalizzdore gammaflcale - ITIS Negrelli 2007/08 - Gimeppe Ricci, Luigno Calvi - 18
  19. 19. Tokenize. c TokenType getToken(const chaz ‘s, char **ps, float *pf) 1 TokenType L = FINE; ‘pf — 0.3; ‘p3 — (Char *). =,; fa" salta c311 spazi while (isspace(“ps)) (’ps]++: ii (1sdiq1Ll"ps)) 4 ‘pi = aLof(*ps); whilc (ìsdigit(‘*p. a) I (“p. =1——'. ')) (‘ps)-+: : — NUMERO: 4 : - (TokcnTypc)“ps; (*psJ++; I Analizzatore grammaticale - ITIS Negrelli 2007/08 — Giuseppe Ricci, Luigino Calvi - 19
  20. 20. Stack. h fiifndef _STACK_H Melina _STACK_H ma! Booi Mulino Bool int Iflendif lfifndef STACKTYPE ladine STACKTYPE flod flendif tfifndef STACK_SIZE Molino STACIQSIZE 10o fiendif typodof struct ( Int sp: sTAcicrYPE vduoflSTACK_8lE]: i Tshcli ; void StackEmplflTSîack ‘); Il svmîa lo stack void Stadif-‘uahflsîack ‘, STACKTYPEk / I inserisce un elemento void stadtPomTsladt ‘): Il elimina l'elemento in cima allo stadi STACKTYPE Sîackîopflstack}: /I ritorna l'elemento In cima allo stack Booi stacklsEmpiyflstack); II controlla se lo stack e‘ vuoto void stadrPrimflstack); Il visualizza lo stato dallo stack (per dobug) fiendlf Il _STACK_H Analizzatore grammaticale - ITIS Negrelli 2007/08 — Giuseppe Ricci. Luigino Calvi - 20
  21. 21. Stack. c / /* Costruttore di default: crea uno stack vuoto void 3tackIn1t(T8tack *stack) l stack->sp - -1; / / equivalente a ('stack). sp - -1; / /* Inserimento dl un elemento nello stack void StackPush(TStack ‘stack, conat STACKTYPE valve) l if (stack->sp < STACK_SIZE) stack—>va; ues[—+(stack—>sp)] = value; / /'* eliminazione dell'elemento in cima alio stack void Stnckroptlstnck *stack) l if (stack->sp >- 0) (stack->sp)--; / /* accesso all'elemento in cima allo stack float staekTop(Tstack stack) l return stack. values[stack. spI; 1 / '/* controllo se lo stack e‘ vuoto 8001 StackI| Enpty(TStack stack) l return stack. sp -- -1: ) Analizzatore gammaiicale - I1’IS Negrelli 2007/08 - Giuseppa Ricci, Luigho Calvi - 21
  22. 22. Esercizi (per casa) 1. Testare ll codice consegnato 3. Estensione del parser 1 1, Introdurre l'operatore " POTENZA : pow(x. y) = X“ ( OperatoreMoltiplicativo -> ' | f l " ) 2. verificarne il funzionamento attraverso le funzioni DebugAssert 5. Gestione dell’errore 1 1. Modificare getToken introducendo la gestione dell'errore (token = ERRORE) 2. Modificare Valuta in modo che restituisca tra i parametri una variabile intera er1(1=ERRORE. 0=OK) 3. Modificare il main() in modo che in caso di errore visualizzi un messaggio appropriato 4. Verificame il funzionamento attraverso le funzioni DebugAssert 6. Gestione dell’errore 2 1. Introdurre in Scannerc la funzione che imposta _cur_token al valore ERRORE 2. Modificare la funzione espressione() in modo che imposti il token a ERRORE se non è presente una parentesi chiusa quando se lo aspetta 3. verificarne il funzionamento attraverso le funzioni DebugAssert 7. Gestione dell’errore 3 ‘l. Introdurre in Scanner. c la funzione che restituisce la posizione nella stringa del carattere successivo al token analizzato 2. Modificare Valuta in modo che restituisca nel parametro m O (zero) se non ci sono stati errori o la posizione nella stringa del carattere errato in caso di errore Modificare il main() in modo che in caso di errore visualizzi un messaggio appropriato 4. Verificame il funzionamento attraverso le funzioni DebugAssert Se’ Analizzatore grammaticale — ITlS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 22
  23. 23. Esercizi (per casa) 1. Estensione dcl parscr 2 1, Attribuìre all'operatore POTENZA una priorità maggiore di quella data agli operatori moltiplicativi 2. verificarne il funzionamento attraverso le funzioni DebugAssert Espressione 9 Terrnlne OperatoreAddittivo Espressione | Termine Termine 9 Fattore OperatoreMoltiplicativo Termine | Fattore Fattore 9 (Espressione) | Numero Numero 9 Cifra | Cifra Numero OperatoreAdditivo 9 + | — OperatoreMoltiplicativo 9 ‘ | l Cifra90|1|2|3|4|5|6|7|8|9|0 Espressione 9 TemiineProdotto OperatoreAddittivo Espressione | Termine TermineProdotto 9 TerminePotenza OperatoreMoltiplicativo TermineProdotto | TerimnePotenza TerminePotenza 9 Fattore OperatoreMoltiplicativo TemiinePotenza | Fattore Fattore 9 (Espressione) | Numero Numero 9 Cifra | Cifra Numero OperatoreAdditivo 9 + | - OperatoreMoltiplicativo 9 ‘ | / OperatorePotenza 9 " Cifra90|1|2|3|4|5|6|7|8|9|0 Analizzatore grammaticale — ITlS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 23
  24. 24. Esercizi (per casa) 1. Estensione del parser 3 1. Introdurre la produzione descritta sotto 2. verificarne il funzionamento attraverso le funzioni DebugAssert Assegnazione 9 Identificatore = Espressione Espressione 9 TermineProdotto OperatoreAddittivo Espressione | Termine TermineProdotto 9 TerminePotenza OperatoreMoltiplicativo TermineProdotto | TeriminePotenza TerminePotenza 9 Fattore OperatoreMoltiplicativo TerminePotenza | Fattore Fattore 9 (Espressione) | Numero Numero 9 Cifra | Cifra Numero OperatoreAdditivo 9 + | - OperatoreMoltiplicativo 9 * | / OperatorePotenza 9 " Cifra90|1|2|3|4|5|6|7|8|9|0 Identificatore 9 Carattere | Carattere Identificatore Carattere 9 [A. .Z] | [a. .z] Analizzatore grammaticale — ITlS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 24
  25. 25. ITIS Negrelli — Feltre (BL) Analizzatore grammaticale Parser di un’espressione aritmetica Fine Analizzatore grammaticale — ITlS Negrelli 2007108 — Giuseppe Ricci, Luigino Calvi - 25
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×