0% encontró este documento útil (0 votos)
133 vistas23 páginas

Analizador Sintáctico ("Parser")

El analizador sintáctico analiza una cadena de tokens obtenida del analizador léxico y verifica si se genera con la gramática del lenguaje. Construye un árbol sintáctico y lo pasa al resto del compilador. Existen métodos descendentes y ascendentes para construir el árbol. El manejo de errores sintácticos es responsabilidad del diseñador del compilador.

Cargado por

Miguel Molina
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
133 vistas23 páginas

Analizador Sintáctico ("Parser")

El analizador sintáctico analiza una cadena de tokens obtenida del analizador léxico y verifica si se genera con la gramática del lenguaje. Construye un árbol sintáctico y lo pasa al resto del compilador. Existen métodos descendentes y ascendentes para construir el árbol. El manejo de errores sintácticos es responsabilidad del diseñador del compilador.

Cargado por

Miguel Molina
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 23

Analizador Sintáctico

(“Parser”)
Las Fases del Compilador
Posición del analizador
sintáctico en el modelo del
compilador
Función
Analiza una cadena de tokens obtenida del
analizador de léxico y comprueba si la misma
puede ser generada por la gramática del
lenguaje fuente.

El analizador sintáctico cuando encuentra un


error debe reportarlo y recuperarse para
seguir analizando el resto del programa

Construye un árbol sintáctico y lo pasa al


resto del compilador para que lo siga
procesando
Tipos de Analizadores

Métodos Universales.- Pueden analizar


cualquier gramática, son demasiado
ineficientes para usarse en una producción
de compiladores

Métodos Descendentes.- Construyen árboles


sintácticos desde la parte superior (raíz) a la
parte inferior (hojas).

Métodos Ascendentes.- Empiezan por la


hojas y avanzan hacia la raíz.
Manejo de errores
sintácticos
Los lenguajes de programación no describen
la forma en que un compilador debe
responder a los errores

El manejo de los mismos es responsabilidad


del diseñador del compilador.

La planeación del manejo de errores desde


el principio puede simplificar la estructura del
compilador y mejorar su capacidad para
manejar errores.
Tipos de Errores

Errores léxicos.
Escritura incorrecta de identificadores, palabras
claves u operadores.

Errores sintácticos.
Colocación incorrecta de símbolos como ;:
Faltante o sobrantes de “{}”
Un case sin switch.
Tipos de Errores

 Errores semánticos.
 Conflicto de tipos entre los operadores y los operandos.

 Errores lógicos.
 Uso del operador de asignación = en vez del operador
de comparación ==
 Llamado infinito a una función recursiva

 En tiempo de compilación los errores semánticos


y lógicos son los más difíciles de detectar.
Objetivos del manejador de
errores
Reportar la presencia de errores con claridad
y precisión.

Recuperarse de cada error lo bastante


rápido como para poder detectar los errores
siguientes.

No debe retrasar de manera significativa el


procesamiento de programas correctos
Estrategias de recuperación
de errores
 En modo de pánico.
 Al descubrirse un error descarta los símbolos de entrada
hasta encontrar uno que pertenezca a los tokens de
sincronización “; , } end”.

 Es un método muy simple que omite gran cantidad


considerable de entrada sin verificar errores adicionales.

 Garantiza que no entrará en un ciclo repetitivo


Estrategias de recuperación
de errores
 En modo de pánico.
Estrategias de recuperación
de errores
A nivel de frase
Al descubrirse un error puede realizar una
corrección local sobre la entrada restante.
Ejemplo sustituir una “,” por un “.”, eliminar o
insertar un “;”
La elección de la corrección depende del
diseñador del compilador.
Debemos tener cuidado de no elegir situaciones
que nos lleven a ciclos infinitos.
Estrategias de recuperación
de errores
Producciones de errores
Si se tiene idea de los errores comunes que
pueden encontrarse, se puede aumentar la
gramática del lenguaje con producciones que
generen las construcciones erróneas.
Corrección Global
Lo ideal sería que el compilador hiciera la menor
cantidad de cambios en el procesamiento de la
cadena de entrada incorrecta.
Gramáticas libres de
contexto:
Definición.-Es una gramática formal que se define mediante una
cuadrupla: G = (N, T, P, S) donde:
 N es un conjunto finito de símbolos no terminales
 T es un conjunto finito de símbolos terminales N ∩ T =
 P es un conjunto finito de producciones
 S es el símbolo distinguido o axioma S (N T)

Cada regla de producción tiene la forma: V→w

Son lo suficientemente simples como para permitir la construcción de


algoritmos de análisis sintáctico eficientes los cuales, para una cadena
dada, determinan cuándo y cómo pueden ser generados a partir de la
gramática.
Gramáticas libres de
contexto: Definición
 Los Terminales.- son símbolos básicos mediante los cuales se forman
las cadenas

 Los No terminales.- son variables sintácticas que denotan conjuntos


de cadenas que ayudan a definir el lenguaje generado por la
gramática

 En una gramática un no terminal es considerado como el símbolo


inicial y el conjunto de cadenas que representa es el lenguaje
definido por la gramática.

 Las producciones de una gramática especifican la forma en que


pueden combinarse los terminales y los no terminales para formar
cadenas
Gramáticas libres de
contexto Definición
Inst  if (expr) then instr else instr

Terminales: if, then, else


No Terminales: expr, instr
Símbolo inicial: Inst
Produccion: compuesta por: un no terminal
inicial (emcabezado) seguido de  y un
cuerpo (cero o mas terminales y no
terminales)
Gramática que define
expresiones aritméticas simples

Expr  Expr Op Expr


Expr  (Expr)
Expr  - Expr
Expr  Id
Op  +
Op  -
Op  *
Op  /
Convenciones de notación
Convenciones de notación
Convenciones de notación
Traducción de la gramática
anterior
Expr  Expr Op Expr E  E OP E | (E) | -E | id
Expr  (Expr) OP  + | - | * | /
Expr  - Expr
Expr  Id
Op  +
Op  -
Op  *
Op  /
Derivaciones

La idea central es que se considera una producción


como una regla de escritura, donde el no terminal de la
izquierda es sustituido por la cadena del lado derecho
de la producción.
Dada la Gramática E  E + E | E * E | -E | (E) | id
La Sustitución de E por –E se escribirá se describirá
como: E == > -E . Y se leerá como E deriva a –E
A esta secuencia la llamaremos la derivación de –(id) a
partir de E
E == > -E == > -(E) == > (-id)
Derivaciones: Tipos

Derivación por la izquierda : Derivación donde


solo el no terminal de más a la izquierda de
cualquier forma de frase se sustituye en cada
paso.
 Derivación por la derecha o Derivación
canónica: Derivación donde el no terminal más a
la derecha se sustituye en cada paso.

También podría gustarte