3.3 El problema del Análisis Sintáctico.
El mayor problema del análisis sintáctico es reconocer la gramática de una cadena de símbolos leída y construir su árbol de análisis sintáctico e indicar si pertenece a la gramática del lenguaje o de lo contrario, indicar que la cadena de símbolos es sintácticamente incorrecta. Para hacer un análisis sintáctico es necesario categorizar los tokens como terminales y no terminales, ya que esta clasificación nos ayudara a construir los arboles de análisis sintáctico. Lo que se debe hacer antes de realizar el árbol de análisis sintáctico es decidir que regla aplicar según el token que generalmente es entregado por el análisis lexicográfico, suponiendo que la lectura de los tokens realizada por el análisis lexicográfico fue hecha en sentido izquierda - derecha. Para un compilador una sentencia u oración es un programa, al cual tiene que ligar con una gramática y con un árbol de análisis sintáctico.
3.3.1 Análisis Sintáctico Descendente.
El análisis sintáctico descendente construye un árbol de análisis sintáctico desde la raíz hasta llegar a las hojas. Los pasos para generar el árbol sintáctico descendente son los siguientes: 1. Comienza por el primer símbolo o token leído, como la raíz del árbol de análisis sintáctico.2. En cada paso colocar el símbolo "no terminal" del lado izquierdo del actual.
3.3.2 Análisis Sintáctico Ascendente.
Se denominan analizadores sintácticos ascendentes por que pretenden construir un árbol sintáctico para una determinada cadena de entrada, empezando por las hojas y constituyendo el árbol hasta llegar a la raíz. Los analizadores LR(k) realizan eficientemente el análisis ascendente sin retroceso y pueden ser generados para la mayoría de las gramáticas libres de contexto. La L de su nombre indica que se lee la entrada de izquierda a derecha; La R que el análisis se realiza aplicando derivaciones mas a la derecha en sentido inverso y k es el numero de símbolos de entrada por delante que mira el analizador para tomar decisiones. La ventaja de este tipo de análisis ascendente es que puede encontrar errores tan pronto como es posible y su principal desventaja es que cuesta demasiado trabajo construirlos. Los pasos para construir un analizador sintáctico ascendente son: 1.- Comience con la cadena de caracteres (las hojas del árbol de análisis sintáctico que será creado) 2.- Intente reducir al símbolo de inicio encontrando el controlador actual:El controlador es.a. La colección más extensa de terminales y no terminales en la parte extrema izquierda de la entrada que pueda encontrarse en el lado derecho de alguna producción yb. Tal que todos los símbolos a la derecha del manejador sean terminales y c. Tal que el reemplazo del controlador con el lado izquierdo de la producción eventualmente (al encontrar más controladores) conduce de regreso al símbolo de inicio.
3.3.3 Cuestiones del análisis sintáctico
Tanto en los analizadores sintácticos ascendentes como en los descendentes involucran cuestiones a resolver.
Problemas con el caso descendente
· Mas de una elección. Estos problemas se dan cuando una regla gramatical ya identificada por el analizador nos muestra más de una opción para sus símbolos no terminales. En estos casos se deberá elegir de forma aleatoria y arriesgarse a una mala elección y por consecuencia producir un retroceso en el análisis. Una manera mas eficiente para estos casos es leer los siguientes tokens de la cadena.
· Recursividad izquierda. Hay casos en los que el analizador sintáctico aplica las reglas de gramática mas de una vez ya que la lectura de la cadena es hecha de manera parcial y por consecuencia no sabe identificar cuantas veces se va a producir esa regla. A este proceso de repetición se le llama recursividad izquierda y debe modificarse cuando se utiliza el análisis descendente.
· Factorización Izquierda. Este problema se da cuando dos producciones comparten símbolos y el analizador debe factorizar esta similitud evitando la confusión entre cual producción extender y cual no.
Ejemplos
Ejemplo en lenguaje Java.
Como se vio en los capítulos anteriores, para hacer un análisis sintáctico es necesario contar con las gramáticas definidas de las expresiones del lenguaje Supongamos la gramática de la estructura de decisión sencilla de java.
La sintaxis de la gramática para esta instrucción es la siguiente.
If ( Expresión booleana ) {
estatutos
}
Para efectos de representación en el árbol gramatical llamaremos "inst" a la gramática de esta expresión
Inst =
If = Palabra reservada y terminal
(= Carácter Especial y terminal.
Expresión Booleana = Sucesión de símbolos o tokens que retornan un valor verdadero o falso y símbolo no terminal.
)= Carácter especial y terminal.
{= Carácter especial y terminal.
Estatutos = Conjunto de expresiones del lenguaje y símbolo no terminal.
}= Carácter especial y terminal.
Ahora podemos realizar su árbol gramatical.
Ejemplo en lenguaje natural Español.
Supongamos la gramática de una oración afirmativa de la lengua española.
"El perro blanco come con rapidez."
Esta oración sencilla consta de dos partes principales en su gramática que es un sujeto y predicado
Sujeto (símbolo no terminal)= "El perro blanco"
Predicado (símbolo no terminal) = "come con rapidez"
El sujeto y el predicado a la vez se dividen en símbolos importantes de la gramática. En este ejemplo el sujeto consta de un articulo, un sustantivo y un adjetivo
"El perro blanco"
Articulo (símbolo terminal)= "El".
Sustantivo (símbolo terminal) = "perro".
Adjetivo (Símbolo terminal) = "blanco".
Así mismo en este ejemplo el predicado se compone de una preposición y adjetivo directo.
Preposición (símbolo terminal) = "con".
Adjetivo directo (símbolo terminal) = "rapidez".
Con esta información básica, podemos generar un árbol de análisis sintáctico para una oración sencilla afirmativa.

Ejemplo de lenguaje estructurado a consultas (SQL)
Finalmente supongamos la estructura de una expresión en SQL que funciona para borrar un registro de una tabla.
DELETE FROM Tabla
WHERE Campo = "Valor"
Como se puede observar la expresión consta de palabras reservadas, identificadores, operadores y literales, todos estos símbolos son terminales. Por lo tanto su árbol gramatical es muy sencillo.
En este ejemplo la palabra "inst" corresponde a la expresión anterior.
Sindicación
Este artículo no tiene Comentario por el momento .....