Programmazione orientata agli oggetti in ANSI-C. Il riconoscitore

Programmazione orientata agli oggetti in ANSI-C. Il riconoscitore

Ad un alto livello di analisi, le espressioni vengono riconosciute dalla funzione sum() che internamente chiama scan() e restituisce una rappresentazione che può essere analizzata da process() e da delete().

Se non usiamo yacc riconosciamo le espressioni con un metodo ricorsivo, dove le regole “grammaticali” sono tradotte assieme a funzioni C equivalenti. Per esempio, una somma è un prodotto, seguito da zero o da più gruppi, ognuno dei quali consiste in un operatore addizione e un altro prodotto. Una regola grammaticale come

sum : product {  + | - product } ...

viene tradotto in C con una funzione simile a

void sum (void)
{
product();
for (;;)
{ switch (token) {
case ’+’:
case ’—’:
scan(0), product(); continue;
}
return;
}
}

C’è una funzione C per ogni regola grammaticale, in modo che le regole possano “chiamarsi” l’una con l’altra. Le alternative sono tradotte in istruzioni switch o if, iterazioni nella grammatica producono cicli in C. Il solo problema è che dovremmo in qualche modo evitare la ricorsione infinita.

token contiene sempre il successivo simbolo di input. Se lo riconosciamo, dobbiamo chiamare scan(0) per avanzare nell’analisi dell’input e memorizza un nuovo simbolo in token.

STAMPA     Tags:,

Leave a Reply