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: CODELas 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: }
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.