Analizzatori lessicali e alberi sintattici

Spread the love

Prima parte: analizzatori lessicali

Nei linguaggi di programmazione, l’esecuzione di un programma è affidata a due componenti che sono presenti sia nei compilatori che negli interpreti:

  • l’analizzatore lessicale (token analyzer)
  • il costruttore dell’albero sintattico (parse tree)

In sostanza si tratta di scorrere il testo di un programma, individuarne tutti i simboli (compito del primo componente) e, nella fase successiva, di costruire l’albero sintattico in modo tale da capire se il programma scritto soddisfa la grammatica formale del linguaggio.

PHP offre tra le sue funzioni un interessante token analyzer che permette di isolare gli elementi di un programma per capire la prima parte del processo di compilazione/interpretazione: l’istruzione token_get_all.

Qui di seguito il codice che utilizza questa funzione per isolare gli elementi lessicali o token del programma:


<?php
$tokens 
token_get_all('
<?php
echo("ciao");
$i=0;
$i--;
for ($j=0; $j<=1; $j++)
echo \'ciao\';
?>'
);

echo ‘<xmp>’;
foreach (
$tokens as $token) {
if (
is_array($token)) {
echo 
“Line {$token[2]}: “,
token_name($token[0]),
” (‘{$token[1]}‘)”,
PHP_EOL;
}
}

echo ‘</xmp>’;

Se si fa girare questo programma, avremo l’analisi del frammento di programma racchiuso nella funzione token_get_all().

Il risultato è il seguente:

Line 1: T_OPEN_TAG (' Line 1: T_WHITESPACE ('
')
Line 2: T_ECHO ('echo')
Line 2: T_CONSTANT_ENCAPSED_STRING ('"ciao"')
Line 2: T_WHITESPACE ('
')
Line 3: T_VARIABLE ('$i')
Line 3: T_LNUMBER ('0')
Line 3: T_WHITESPACE ('
')
Line 4: T_VARIABLE ('$i')
Line 4: T_DEC ('--')
Line 4: T_WHITESPACE ('
')
Line 5: T_FOR ('for')
Line 5: T_WHITESPACE (' ')
Line 5: T_VARIABLE ('$j')
Line 5: T_LNUMBER ('0')
Line 5: T_WHITESPACE (' ')
Line 5: T_VARIABLE ('$j')
Line 5: T_IS_SMALLER_OR_EQUAL ('<=')
Line 5: T_LNUMBER ('1')
Line 5: T_WHITESPACE (' ')
Line 5: T_VARIABLE ('$j')
Line 5: T_INC ('++')
Line 5: T_WHITESPACE (' ')
Line 6: T_ECHO ('echo')
Line 6: T_WHITESPACE (' ')
Line 6: T_CONSTANT_ENCAPSED_STRING (''ciao'')
Line 6: T_WHITESPACE (' ')
Line 7: T_CLOSE_TAG ('?>')

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.