Análisis bottom-up se inicia a partir de los nudos de las hojas de un árbol y trabaja en dirección hacia arriba hasta que llega al nodo raíz. En este sentido, partimos de una frase y, a continuación, aplicar normas de producción en forma contraria a fin de alcanzar el símbolo de arranque. La imagen siguiente muestra la parte inferior de los analizadores.
Shift-reducir el análisis utiliza dos únicos pasos para la parte inferior de análisis. Estos pasos son conocidos como cambio de paso y reducir de paso.
Paso de cambio: el paso de cambio se refiere a la promoción del puntero de entrada con el siguiente símbolo de entrada, el cual se denomina el símbolo cambia. Este símbolo se empuja en la pila. Cambia el símbolo es tratado como un único nodo del árbol analizar.
Reducir paso: Cuando el analizador encuentra una regla gramatical (RHS) y reemplaza a (LHS), se conoce como reducir paso. Esto ocurre cuando la parte superior de la pila contiene un identificador. A fin de reducir, un POP función se realiza en la pila que los contaminantes orgánicos persistentes de la palanca y se reemplaza con LHS símbolo no terminal.
El analizador LR es un non-recursive, shift-reducir, analizador bottom-up. Utiliza una amplia clase de gramática libre de contexto lo que lo convierte en el más eficiente técnica de análisis sintaxis. LR los analizadores son también conocidos como LR(k) analizadores, donde L es de izquierda a derecha la exploración del flujo de entrada; R significa para la construcción de más a la derecha en derivación hacia atrás, y k indica el número de símbolos anticipada a la hora de tomar decisiones.
Hay tres ampliamente utilizado algoritmos disponibles para construir un analizador LR:
Aquí se describe un esqueleto de un algoritmo LR analizador:
token = next_token() repeat forever s = top of stack if action[s, token] = “shift si” then PUSH token PUSH si token = next_token() else if action[s, tpken] = “reduce A::= β“ then POP 2 * |β| symbols s = top of stack PUSH A PUSH goto[s,A] else if action[s, token] = “accept” then return else error()
LL | LR |
---|---|
La izquierda tiene una derivación. | Una derivación derecha en marcha atrás. |
Comienza con el nonterminal de raíz en la pila. | Termina con el nonterminal de raíz en la pila |
Termina cuando la pila está vacía. | Comienza con una pila vacía. |
Usa la pila para designar lo que aún queda por esperar. | Usa la pila para designar lo que ya está visto. |
Construye el árbol análisis top-down. | Construye el árbol análisis bottom-up. |
Continuamente aparece un nonterminal de la pila y empuja el lado derecho correspondiente. | Intenta reconocer un lado derecho de la pila, lo viejo y empuja la correspondiente nonterminal. |
Amplía el no-terminales. | Reduce la no-terminales. |
Lee los terminales cuando aparece uno fuera de la pila. | Lee los terminales mientras que les empuja en la pila. |
Pre-orden el análisis transversal del árbol. | Después de analizar el recorrido de árbol. |