push(s0); b = yylex(); for( ; ; ;) { s = top(0); a = b; switch (action[s][a]) { case "shift t" : push(t); b = yylex(); break; case "reduce A ->alpha" : eval(Sub{A -> alpha}->(top(|alpha|-1).attr, ... , top(0).attr)); pop(|alpha|); push(goto[top(0)][A]); break; case "accept" : return (1); default : yyerror("syntax error"); } }
top(k)
devuelve el elemento que ocupa la
posición k
desde el top de la pila (esto es, está a profundidad k
).
La función pop(k)
extrae k
elementos de la pila.
La notación state.attr
hace referencia al atributo
asociado con cada estado. Denotamos por sub_{reduce A -> alpha}
el código de la acción asociada con la regla
.
Todos los analizadores LR comparten, salvo pequeñas
exepciones, el mismo algoritmo
de análisis. Lo que más los diferencia es la forma en
la que construyen las tablas.
En yapp
la construcción de las tablas de acciones y gotos
se realiza mediante el algoritmo LALR.