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.