push(s0); b = yylex(); for( ; ; ;) { s = top(0); a = b; switch (action[s][a]) { case "shift t" : t.attr = a.attr; push(t); b = yylex(); break; case "reduce A ->alpha" : eval(Sem{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
).
pop(k)
extrae k
elementos de la pila.
state.attr
hace referencia al atributo
asociado con cada estado, el cual desde el punto de vista del programador
esta asociado con el correspondiente símbolo de la parte derecha de la regla.
Nótese que cada estado que está en la pila es el resultado de una transición con
un símbolo. El atributo de ese símbolo es guardado en el objeto estado
cada vez que ocurre una transición.
Sem {reduce A -> alpha}
el código de la acción semántica asociada con la regla
.
Todos los analizadores LR comparten, salvo pequeñas
excepciones, el mismo algoritmo
de análisis. Lo que más los diferencia es la forma en
la que construyen las tablas.
En jison
la construcción de las tablas de acciones y gotos
se realiza por defecto mediante el algoritmo LALR.
Casiano Rodríguez León