 
 
 
 
 
 
 
 
 
 










 
 Sig: La Cola: Diferencias entre
Sup: La Gramática de yapp
 Ant: La Cabecera: Diferencias entre
 Err: Si hallas una errata ...
 
El Cuerpo
El cuerpo de un programa yapp contiene la gramática
y las acciones 
rhss:   rhss '|' rule | rule 
rule:   rhs prec epscode | rhs 
rhs:    #empty     
    |   rhselts   
rhselts: rhselts rhselt | rhselt  
rhselt: symbol | code 
prec: PREC symbol
epscode: # vacio 
    |   code  
code:   CODE
Las acciones semánticas (variable sintáctica code y terminal CODE)
se ejecutan siempre que ocurre una reducción por una regla y, en general, devuelven 
un valor semántico. El código de la acción se copia verbatim
en el analizador. La estrategia usada por el analizador léxico
es contar las llaves abrir y cerrar en 
el texto. Véase el correspondiente fragmento del analizador
léxico:
    ....
    $lineno[0]=$lineno[1];
    ....
    $$input=~/\G{/gc
    and do {
        my($level,$from,$code);
        $from=pos($$input);
        $level=1;
        while($$input=~/([{}])/gc) {
            substr($$input,pos($$input)-1,1) eq '\\' #Quoted 
            and next;
            $level += ($1 eq '{' ? 1 : -1) or last;
        }
        $level and  _SyntaxError(2,"Unmatched { opened line $lineno[0]",-1);
        $code = substr($$input,$from,pos($$input)-$from-1);
        $lineno[1]+= $code=~tr/\n//;
        return('CODE',[ $code, $lineno[0] ]);
    };
Las llaves dentro de cadenas y comentarios no son significativas en la cuenta.
El problema es que el reconocimiento de cadenas en Perl es mas difícil que
en otros lenguajes: existe toda una variedad de formas de denotar una cadena.
Por tanto, si el programador usuario de yapp necesita 
escribir una llave dentro de una cadena de doble comilla, deberá escaparla.
Si la cadena es de simple comilla escaparla no es solución, pues 
aparecería el símbolo de escape en la cadena. En ese caso se deberá añadir 
un comentario con la correspondiente falsa llave. Siguen
algunos ejemplos tomadados de la documentación de Parse::Yapp
"{ My string block }"
"\{ My other string block \}"
qq/ My unmatched brace \} /
# Casamos con el siguiente: {
q/ for my closing brace } / # 
q/ My opening brace { /
# debe cerrarse: }
Ejercicio  7.19.1   
Genere programas de prueba yapp con cadenas que produzcan confusión
en el analizador y observe el comportamiento. Pruébelas en las diferentes
secciones en las que puede ocurrir código: en la cabecera, en el cuerpo 
y en la cola.
 
 
 
 
 
 
 
 
 
 










 
 Sig: La Cola: Diferencias entre
Sup: La Gramática de yapp
 Ant: La Cabecera: Diferencias entre
 Err: Si hallas una errata ...
Casiano Rodríguez León 
2012-05-22