martes, 3 de mayo de 2011

UN TRADUCTOR SIMPLE ORIENTADO A LA SINTAXIS

UN TRADUCTOR SIMPLE ORIENTADO A LA SINTAXIS

En estos capítulos se muestra información acerca de la interpretación de códigos para un programa y de manera simple lo que cada término significa.

La sintaxis de un lenguaje describe a un formato apropiado y la semántica define lo que significa; es decir lo que hace cuando se ejecuta. Además de especificar la sintaxis, se puede utilizar una gramática libre de contexto para ayudar a guiar la traducción de los programas.

Un analizador léxico permite que un traductor maneje instrucciones de varios caracteres como identificadores que se describen como secuencia de caracteres conocidas como tokens durante el análisis sintáctico.

Sintaxis: Una gramática describe la forma natural la estructura jerárquica de la mayoría de las instrucciones de un lenguaje de programación.

Gramática: Se compone de cuatro elementos

1.- Un conjunto de símbolos terminales (“tokens”) en donde estos son símbolos definidos por la gramática.

2.- Un conjunto de no terminales (“variables sintácticas”). En donde cada conjunto de no terminales representa un conjunto de cadenas o terminales.

3.- Un conjunto de producciones que consiste en un no terminal llamada encabezado o lado izquierdo de la producción, una flecha y una secuencia de terminales y no terminales se llama cuerpo o lado derecho de la producción.

4.- Una asignación de una de los no terminales como el símbolo inicial.

Derivaciones: Una gramática deriva empezando con el símbolo inicial sustituyendo en forma repetida un no terminal.

Ejemplo: la lista de parámetros en la llamada a una función.

Arboles de análisis sintáctico

  • -Un árbol consiste en uno o más nodos. Los nodos pueden tener etiquetas que serán símbolos de la gramatica
  • -Solo uno de los nodos es la raíz en donde este tiene un padre pero la raíz no, la raíz es el nodo más alto.
  • -N es el padre del nodo M (hijo de N), los hijos de nuestros nodo se llaman hermanos.
  • Un nodo sin hijos se llama hoja y los otros son nodos interiores.

Un árbol de análisis sintáctico muestra, en forma la manera en el que el símbolo inicial de una gramatica deriva una cadena en el lenguaje. A que tiene una producción Aà XYZ deberá tener un nodo interior etiquetado como A con tres hijos.

Aàsus hijos serían X, Y, Z

Ambigüedad: Una gramatica puede tener más de un árbol de análisis sintáctico que genere una cadena dada de terminales. Se dice que dicha gramatica es ambigua. Para mostrar que una gramatica es ambigua es buscar una cadena de terminales que sea la derivación de más de un árbol de análisis sintáctico.

Asociatividad de los operadores

Cuando un operador como 5 tiene operadores a su izquierda y a su derecha se requiere convenciones para decidir que operador se aplica a ese operando. El operador + se asocia por la izquierda, porque un operando con signos positivos en ambos lados de el pertenece al operador que esta a su izquierda. Los cuatro operadores (suma, resta, multiplicación y división) son asociativos por la izquierda. El operador de asignación = en C y sus descendientes es asociativo por la derecha; es decir, la expresión a=b=c se trata de la misma forma que la expresión a=(b=c).

Procedencia de operadores: En la siguiente expresión (9+5)*2 o 9+ (5*2) se aplican de la misma manera por lo que por lo que en este caso no se resuelve la ambigüedad. Las reglas que definen la precedencia relativa de los operadores son necesarias cuando hay más de un tipo de operador presente. Decimos que * tiene mayor precedencia +, si * recibe sus operandos antes que +.

Con esto creamos dos no terminales llamadas expr y term para los dos niveles de procedencia, y un no terminal adicional llamado factor para generar unidades básicas en las expresiones.

Factor à digito | (expr)

Ahora conoceremos los operadores binarios, * y /, que tienen la mayor procedencia. Como estos operadores asocian por la izquierda, las producciones son similares a las de las listas que asocian por la izquierda.

De manera similar, expr genera listas de términos separados por los operadores aditivos:

Expr à expr + term

| expr – term

Traducción orientada a la sintaxis: Esta se utilice uniendo reglas o fragmentos de un programa a las producciones en una gramatica, en donde si se utiliza; expr à expr1 + term en donde la suma es la expr de las dos funciones. Como ejemplo tenemos los datos de las expresiones, el número de instrucciones

Notación postfija: La notación postfija para una expresión E se define de manera inductiva; por ejemplo si e es una variable, su notación postfija será ella misma y así siempre que la pongamos con sub índices o en paréntesis será siempre ella misma

Análisis sintáctico (parsing): Es el proceso de determinar como puede generarse una cadena de terminales mediante una gramatica. Esto quiere decir que se construye un árbol de análisis sintáctico aun cuando el compilador tal vez no lo construya en la práctica aunque este deberá ser capaz de construir el árbol en principio en caso contrario no se garantiza la traducción correcta. A este método también se le conoce como “descenso recursivo” al cual se utiliza también en análisis sintáctico o implementación de traductores orientados a la sintaxis.

Sintaxis abstracta y concreta: Cuando se hace la representación de sintaxis abstracta se debe realizar un árbol en donde cada nodo interior representa un operador y los hijos nodos serian los operandos del operador. En donde los operandos se tratan como componentes con significado semántico de esa construcción.

1 comentario: