En PL1 he visto como se determinan los break en los lenguajes tipo C (como C, C++, Java, PHP) para que no den errores y se comprueben situaciones como las siguientes:
Se hace con una variable que lleva el control del anidamiento de los ciclos While/Do/For y del Switch. Si hay break, cuando esta variable esta a cero, se genera el error correspondiente.
Recuerdo, que sin saber nada sobre este tipo de cosas, apliqué una solución parecida para un minilector RSS que hice, que tenia que parsear la corrección semántica de un RSS. La sintáctica me la daba el recorrido del arbol XML del RSS.
<?phpque producirá un error como el siguiente:
if (!isset($hola)) {
echo "Break..";
break;
}
?>
Fatal error: Cannot break/continue 1 level in /home/alidhaey/testbreak.php on line 5Este tipo de cosas, se podrian detectar en el analizador sintactico, pero hacerlo allí supone complicar la gramatica del lenguaje (y sí, los lenguajes de programación tienen gramáticas). La solución alternativa, es detectarlo en una fase posterior, de atribución, en la que se van calculando los valores de los tokens que lo requieran.
Se hace con una variable que lleva el control del anidamiento de los ciclos While/Do/For y del Switch. Si hay break, cuando esta variable esta a cero, se genera el error correspondiente.
Recuerdo, que sin saber nada sobre este tipo de cosas, apliqué una solución parecida para un minilector RSS que hice, que tenia que parsear la corrección semántica de un RSS. La sintáctica me la daba el recorrido del arbol XML del RSS.
No hay comentarios:
Publicar un comentario