Vous êtes sur la page 1sur 89

Compiladores

Introducción al Análisis Sintáctico

Gramáticas de Contexto Libre,


Arboles de Parseo y Derivaciones
Resumen
• Overview del análisis léxico
• Qué es análisis sintáctico
• Gramáticas libres de contexto
• Derivaciones y árboles de parseo
• Top-down vs. Bottom-up Parsing
• Grámaticas Ambiguas
• Implementando un Parser

Oscar Bonilla 2 Universidad Galileo


Anatomia de un Compilador
Programa (character stream)
Analizador Léxico (Scanner)
Token
Analizador SintácticoStream
(Parser)
Arbol de Parseo
Generador de Código Intermedio
Representación Intermedia
Optimizador
Representación Intermedia Optimizada
Generador de Código
Código en Assembler
Oscar Bonilla 3 Universidad Galileo
Resumen de Análisis Léxico
• El analizador léxico crea tokens a partir de un
character stream
• Los tokens se definen usando expresiones
regulares

Oscar Bonilla 4 Universidad Galileo


Expresiones Regulares,
Gramáticas y Lenguajes
• Una expresión regular puede ser escrita usando:
– Caracteres en el alfabeto
– Operadores de expresiones regulares:
‘*’ ‘·’ ‘|’ ‘+’ ‘?’ ‘(‘ ‘)’
– Ejemplo:
(-| ε) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?

• Un lenguaje regular es un lenguaje definido por


una expresión regular

Oscar Bonilla 5 Universidad Galileo


Expresiones Regulares,
Gramáticas y Lenguajes
• Qué hay acerca de las variables simbólicas?
– Ejemplo:
num = 0|1|2|3|4|5|6|7|8|9
posint = num · num*
int = (ε | -) · posint
real = int · (ε | (. · posint))
• Sólo son una abreviación, llamada “syntactic
sugar”
– Ejemplo:
(-| ε) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?

Oscar Bonilla 6 Universidad Galileo


Resumen de Análisis Léxico
• El analizador léxico crea tokens a partir de un
character stream
• Los tokens se definen usando expresiones
regulares
• Las expresiones regulares pueden mapearse a un
Automaton Finito No Determinístico (NFA)
– Por construcción simple
• NFA se transforma a un DFA
– Algoritmo de transformación
– Ejecutar un DFA es fácil
Oscar Bonilla 7 Universidad Galileo
Resumen
• Overview del análisis léxico
• Qúe es análisis sintáctico
• Gramáticas libres de contexto
• Derivación y Arboles de Parseo
• Top-down vs. Bottom-up Parsing
• Gramáticas Ambiguas
• Implementando un Parser

Oscar Bonilla 8 Universidad Galileo


Sintaxis y Semántica de un
Lenguaje de Programación?

• Sintaxis
– Como se ve un programa
– Representación textual o estructura
– Es posible una definición matemática precisa

• Semántica
– Cuál es el significado de un programa
– Es más difícil dar una definición matemática

Oscar Bonilla 9 Universidad Galileo


Por qué hacer análisis sintáctico?
• Podemos proveer una definición precisa y fácil
de entender
• Una gramática apropiada imparte estructura a un
lenguaje de programación
• Podemos construir automáticamente un parser
que determine si el programa es sintácticamente
correcto
• Ayuda en el proceso de traducción
• Fácil modificar/añadir al lenguaje
Oscar Bonilla 10 Universidad Galileo
Anatomia de un Compilador
Programa (character stream)
Analizador Léxico (Scanner)
Token
Analizador SintácticoStream
(Parser)
Arbol de Parseo
Generador de Código Intermedio
Representación Intermedia
Optimizador de Código
Representación Intermedia Optimizada
Generador de Código
Código en Assembler
Oscar Bonilla 11 Universidad Galileo
Entrada y Salida de un Parser
Entrada: - (123.3 + 23.6)

Token Stream Arbol de Parseo

Analizador Sintáctico (Parser)


minus_op

left_paren_op
-
num(123.3)

plus_op
( )
num(23.6)

right_paren_op
123.3 23.6
+

Oscar Bonilla 12 Universidad Galileo


Creando una CFG

Oscar Bonilla 13 Universidad Galileo


Resumen
• Overview de análisis léxico
• Qué es análisis sintáctico?
• Gramáticas libres de contexto
• Derivaciones y Arboles de Parseo
• Top-down vs. Bottom-up Parsing
• Gramáticas Ambiguas
• Implementando un Parser

Oscar Bonilla 14 Universidad Galileo


Derivaciones
• Cómo mostramos que una secuencia de tokens
es aceptada por una CFG?
• Una producción es usada para derivar una
secuencia de tokens a partir del símbolo de
inicio
• Dados los strings α ,β y γ
y una producción A → β
Un solo paso de la derivación es
α Aγ ⇒ α β γ
Oscar Bonilla 15 Universidad Galileo
Arbol de Parseo

• Representación gráfica de la estructura


parseada

• Muestra la secuencia de derivaciones efectuada


– Nodos internos son no-terminales
– Hojas son terminales
– Cada nodo padre es el lado izquierdo (LHS) y los
hijos son el lado derecho (RHS) de una producción
Oscar Bonilla 16 Universidad Galileo
Ejemplo de Arbol de Parseo

<expr>

Oscar Bonilla 17 Universidad Galileo


Ejemplo de Arbol de Parseo
<expr> ⇒ <expr> <op> <expr>

<expr>

<expr> <op> <expr>

Oscar Bonilla 18 Universidad Galileo


Ejemplo de Arbol de Parseo
<expr> ⇒ num

<expr>

<expr> <op> <expr>

num

Oscar Bonilla 19 Universidad Galileo


Ejemplo de Arbol de Parseo
<op> ⇒ ‘*’

<expr>

<expr> <op> <expr>

num *

Oscar Bonilla 20 Universidad Galileo


Ejemplo de Arbol de Parseo
<expr> ⇒ ‘(‘ <expr> ‘)’

<expr>

<expr> <op> <expr>

<expr>
num * ( )

Oscar Bonilla 21 Universidad Galileo


Ejemplo de Arbol de Parseo
<expr> ⇒ <expr> <op> <expr>

<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

Oscar Bonilla 22 Universidad Galileo


Ejemplo de Arbol de Parseo
<expr> ⇒ num

<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

num
Oscar Bonilla 23 Universidad Galileo
Ejemplo de Arbol de Parseo
<op> ⇒ ‘+’

<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

num +
Oscar Bonilla 24 Universidad Galileo
Ejemplo de Arbol de Parseo
<expr> ⇒ num

<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

num + num
Oscar Bonilla 25 Universidad Galileo
Ejemplo de Arbol de Parseo
num ‘*’ ‘(‘ num ‘+’ num ‘)’

<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

num + num
Oscar Bonilla 26 Universidad Galileo
Resumen
• Overview del análisis léxico
• Qué es análisis sintáctico?
• Gramáticas libres de contexto
• Derivaciones y Arboles de Parseo
• Top-down vs. Bottom-up Parsing
• Gramáticas Ambiguas
• Implementando un Parser

Oscar Bonilla 27 Universidad Galileo


Derivaciones left-most vs. right-most
• Leftmost derivation
– En el string, encontramos el no-terminal de más a la
izquierda y le aplicamos una producción
– El ejemplo anterior fue de una leftmos derivation

• Rightmost derivation
– Encontramos el no-terminal de más a la derecha y le
aplicamos una producción

Oscar Bonilla 28 Universidad Galileo


Ejemplo de Right-Derivation
Producción:
String: <expr>
<expr>

Oscar Bonilla 29 Universidad Galileo


Ejemplo de Right-Derivation
Producción: <expr> ⇒ <expr> <op> <expr>
String: <expr> <op> <expr>
<expr>

<expr> <op> <expr>

Oscar Bonilla 30 Universidad Galileo


Ejemplo de Right-Derivation
Producción: <expr> ⇒ ‘(‘ <expr> ‘)’
String: <expr> <op> ‘(‘ <expr> ‘)’
<expr>

<expr> <op> <expr>

<expr>
( )

Oscar Bonilla 31 Universidad Galileo


Ejemplo de Right-Derivation
Producción: <expr> ⇒ <expr> <op> <expr>
String: <expr> <op> ‘(‘ <expr> <op> <expr> ‘)’
<expr>

<expr> <op> <expr>

<expr>
( )
<expr> <op> <expr>

Oscar Bonilla 32 Universidad Galileo


Ejemplo de Right-Derivation
Producción: <expr> ⇒ num
String: <expr> <op> ‘(‘ <expr> <op> num ‘)’
<expr>

<expr> <op> <expr>

<expr>
( )
<expr> <op> <expr>

num
Oscar Bonilla 33 Universidad Galileo
Ejemplo de Right-Derivation
Producción: <op> ⇒ ‘+’
String: <expr> <op> ‘(‘ <expr> ‘+’ num ‘)’
<expr>

<expr> <op> <expr>

<expr>
( )
<expr> <op> <expr>

+ num
Oscar Bonilla 34 Universidad Galileo
Ejemplo de Right-Derivation
Producción: <expr> ⇒ num
String: <expr> <op> ‘(‘ num ‘+’ num ‘)’
<expr>

<expr> <op> <expr>

<expr>
( )
<expr> <op> <expr>

num + num
Oscar Bonilla 35 Universidad Galileo
Ejemplo de Right-Derivation
Producción: <op> ⇒ ‘*’
String: <expr> ‘*’ ‘(‘ num ‘+’ num ‘)’
<expr>

<expr> <op> <expr>

<expr>
* ( )
<expr> <op> <expr>

num + num
Oscar Bonilla 36 Universidad Galileo
Ejemplo de Right-Derivation
Producción: <expr> ⇒ num
String: num ‘*’ ‘(‘ num ‘+’ num ‘)’
<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

num + num
Oscar Bonilla 37 Universidad Galileo
Ejemplo de Right-Derivation

String: num ‘*’ ‘(‘ num ‘+’ num ‘)’


<expr>

<expr> <op> <expr>

<expr>
num * ( )
<expr> <op> <expr>

num + num
Oscar Bonilla 38 Universidad Galileo
Ejemplo de Right-Derivation
⇒ <expr>
⇒ <expr> <op> <expr>
⇒ <expr> <op> ‘(‘ <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> num ‘)’
⇒ <expr> <op> ‘(‘ <expr> ‘+’ num ‘)’’
⇒ <expr> <op> ‘(‘ num ‘+’ num ‘)’
⇒ <expr> ‘*’ ‘(‘ num ‘+’ num ‘)’
⇒ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 39 Universidad Galileo


Top-down vs. Bottom-up Parsing
• Normalmente escaneamos de izquierda a
derecha

• Left-most derivation refleja top-down parsing


– Comenzamos con el símbolo inicial
– Terminamos con el string de tokens

Oscar Bonilla 40 Universidad Galileo


Top-down Parsing
• Left-most derivation
⇒ <expr>
⇒ <expr> <op> <expr>
⇒ num <op> <expr>
⇒ num ‘*’ <expr>
⇒ num ‘*’ ‘(‘ <expr> ‘)’
⇒ num ‘*’ ‘(‘ <expr> <op> <expr> ‘)’
⇒ num ‘*’ ‘(‘ num <op> <expr> ‘)’
⇒ num ‘*’ ‘(‘ num ‘+’ <expr> ‘)’
⇒ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 41 Universidad Galileo


Top-down vs. Bottom-up Parsing
• Normalmente escaneamos de izquierda a derecha

• Left-most derivation refleja top-down parsing


– Comenzamos con el símbolo inicial
– Terminamos con el string de tokens

• Right-most derivation refleja bottom-up parsing


– Comenzamos con el string de tokens
– Terminamos con el símbolo inicial

Oscar Bonilla 42 Universidad Galileo


Bottom-up Parsing
• Right-most derivation
⇒ <expr>
⇒ <expr> <op> <expr>
⇒ <expr> <op> ‘(‘ <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> num ‘)’
⇒ <expr> <op> ‘(‘ <expr> ‘+’ num ‘)’’
⇒ <expr> <op> ‘(‘ num ‘+’ num ‘)’
⇒ <expr> ‘*’ ‘(‘ num ‘+’ num ‘)’
⇒ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 43 Universidad Galileo


Bottom-up Parsing
• Right-most derivation
⇒ <expr>
⇒ <expr> <op> <expr>
⇒ <expr> <op> ‘(‘ <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> num ‘)’
⇒ <expr> <op> ‘(‘ <expr> ‘+’ num ‘)’’
⇒ <expr> <op> ‘(‘ num ‘+’ num ‘)’
⇒ <expr> ‘*’ ‘(‘ num ‘+’ num ‘)’
⇒ num ‘*’ ‘(‘ num ‘+’ num ‘)’

Oscar Bonilla 44 Universidad Galileo


Bottom-up Parsing
• Right-most derivation
⇒ num ‘*’ ‘(‘ num ‘+’ num ‘)’
⇒ <expr> ‘*’ ‘(‘ num ‘+’ num ‘)’
⇒ <expr> <op> ‘(‘ num ‘+’ num ‘)’
⇒ <expr> <op> ‘(‘ <expr> ‘+’ num ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> num ‘)’
⇒ <expr> <op> ‘(‘ <expr> <op> <expr> ‘)’
⇒ <expr> <op> ‘(‘ <expr> ‘)’
⇒ <expr> <op> <expr>
⇒ <expr>

Oscar Bonilla 45 Universidad Galileo


Resumen
• Overview de análisis léxico
• Qué es análisis sintáctico?
• Gramáticas libres de contexto
• Derivaciones y Arboles de Parseo
• Top-down vs. Bottom-up Parsing
• Gramáticas Ambiguas
• Implementando un Parser

Oscar Bonilla 46 Universidad Galileo


Otro Ejemplo
• Entrada:
124 + 23.5 * 86

• Token Stream:
num ‘+’ num ‘*’ num

Oscar Bonilla 47 Universidad Galileo


Otro Ejemplo
Producción:
String: <expr>
<expr>

Oscar Bonilla 48 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <expr> <op> <expr>
String: <expr> <op> <expr>
<expr>

<expr> <op> <expr>

Oscar Bonilla 49 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <num>
String: num <op> <expr>
<expr>

<expr> <op> <expr>

num

Oscar Bonilla 50 Universidad Galileo


Otro Ejemplo
Producción: <op> ⇒ ‘+’
String: num ‘+’ <expr>
<expr>

<expr> <op> <expr>

num +

Oscar Bonilla 51 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <expr> <op> <expr>
String: num ‘+’ <expr> <op> <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>


num +

Oscar Bonilla 52 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ num
String: num ‘+’ num <op> <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>


num +

num

Oscar Bonilla 53 Universidad Galileo


Otro Ejemplo
Producción: <op> ⇒ ‘*’
String: num ‘+’ num ‘*’ <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>


num +

num *

Oscar Bonilla 54 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ num
String: num ‘+’ num ‘*’ num
<expr>

<expr> <op> <expr>

<expr> <op> <expr>


num +

num * num

Oscar Bonilla 55 Universidad Galileo


Otro Ejemplo

String: num ‘+’ num ‘*’ num


<expr>

<expr> <op> <expr>

<expr> <op> <expr>


num +

num * num

Oscar Bonilla 56 Universidad Galileo


Otro Ejemplo

String: num ‘+’ num ‘*’ num

• Hay otro orden de derivación?

Oscar Bonilla 57 Universidad Galileo


Otro Ejemplo

String: <expr>
<expr>

Oscar Bonilla 58 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <expr> <op> <expr>
String: <expr> <op> <expr>
<expr>

<expr> <op> <expr>

Oscar Bonilla 59 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <num>
String: num <op> <expr>
<expr>

<expr> <op> <expr>

num

Oscar Bonilla 60 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <num>
String: num <op> <expr>
<expr>

<expr> <op> <expr>

num

Pero también podemos usar esta producción


<expr> ⇒ <expr> <op> <expr>
Oscar Bonilla 61 Universidad Galileo
Otro Ejemplo
Producción:
String: <expr> <op> <expr>
<expr>

<expr> <op> <expr>

Pero también podemos usar esta producción


<expr> ⇒ <expr> <op> <expr>
Oscar Bonilla 62 Universidad Galileo
Otro Ejemplo
Producción: <expr> ⇒ <expr> <op> <expr>
String: <expr> <op> <expr> <op> <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>

Oscar Bonilla 63 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <num>
String: num <op> <expr> <op> <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>

num

Oscar Bonilla 64 Universidad Galileo


Otro Ejemplo
Producción: <op> ⇒ <+>
String: num ‘+’ <expr> <op> <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>

num +

Oscar Bonilla 65 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <num>
String: num ‘+’ num <op> <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>

num + num

Oscar Bonilla 66 Universidad Galileo


Otro Ejemplo
Producción: <op> ⇒ ‘*’
String: num ‘+’ num ‘*’ <expr>
<expr>

<expr> <op> <expr>

<expr> <op> <expr>


*

num + num

Oscar Bonilla 67 Universidad Galileo


Otro Ejemplo
Producción: <expr> ⇒ <num>
String: num ‘+’ num ‘*’ num
<expr>

<expr> <op> <expr>

<expr> <op> <expr>


* num

num + num

Oscar Bonilla 68 Universidad Galileo


Otro Ejemplo

String: num ‘+’ num ‘*’ num


<expr>

<expr> <op> <expr>

<expr> <op> <expr>


* num

num + num

Oscar Bonilla 69 Universidad Galileo


Mismo string – Dos derivaciones
num ‘+’ num ‘*’ num
<expr> <expr>

<expr> <op> <expr> <expr> <op> <expr>

<expr> <op> <expr> <expr> <op> <expr>


num + * num

num * num num + num

124 + (23.5 * 86) = 2145 (124 + 23.5) * 86 = 12685

Oscar Bonilla 70 Universidad Galileo


La Gramática es Ambigua
• Aplicar diferentes ordenes de derivación
produce árboles de parseo diferentes
• Esto no es bueno!
– Lleva a resultados ambiguos
– Muy probablemente va a producir resultados
inesperados
• Algunas veces el reescribir la gramática con
más no-terminales va a eliminar la ambiguedad

Oscar Bonilla 71 Universidad Galileo


La Gramática Ambigua
<expr> → <expr> <op> <expr>
<expr> → ( <expr> )
<expr> → - <expr>
<expr> → num
<op> → +
<op> → *

Oscar Bonilla 72 Universidad Galileo


Eliminando la Ambiguedad
<expr> → <expr> + <term>
<expr> → <term>
<term> → <term> * <unit>
<term> → <unit>
<unit> → num <expr> → <expr> <op> <expr>
<expr> → ( <expr> )
<unit> → ( <expr> ) <expr> → - <expr>
<expr> → num
<op> → +
<op> → *
Oscar Bonilla 73 Universidad Galileo
Eliminando la Ambiguedad

String: num ‘+’ num ‘*’ num


<expr>

<expr> <term>
+
<term> <term> <unit>
*
<unit> <unit>
num

num num
Oscar Bonilla 74 Universidad Galileo
Primer ejemplo en la nueva gramática
<expr>
num ‘*’ ‘(‘ num ‘+’ num ‘)’
<term>

<term> <unit>
*
<unit> ( <expr> )
num <expr> <term>
+
<term> <unit>

<unit> num

num
Oscar Bonilla 75 Universidad Galileo
Pregunta: Es esta gramática
ambigua?

<stmt> → if <expr> then <stlist>


<stmt> → if <expr> then <stlist> else <stlist>

Oscar Bonilla 76 Universidad Galileo


Pregunta: Cómo la hacemos no
ambigua?

<stmt> → if <expr> then <stlist>


<stmt> → if <expr> then <stlist> else <stlist>

Oscar Bonilla 77 Universidad Galileo


Resumen
• Overview de análisis léxico
• Qué es análisis sintáctico?
• Gramáticas libres de contexto
• Derivaciones y Arboles de Parseo
• Top-down vs. Bottom-up Parsing
• Gramáticas Ambiguas
• Implementando un Parser

Oscar Bonilla 78 Universidad Galileo


Implementando un Parser
• La implementación de un parser para algunas
CFG’s puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir la producción correcta sin ver
que viene en el input (looking ahead)

Oscar Bonilla 79 Universidad Galileo


Ejemplo de look ahead
• Gramática
<stmt> → a <long> b
<stmt> → a <long> c
<long> → x <long> | x

• Input string “axxxxxxxxxxxxxxxxx…….”

• Puede que tengamos que ver un montón de


símbolos del input antes de decidirnos por una
producción

Oscar Bonilla 80 Universidad Galileo


Implementando un Parser
• Implementar un parser para algunas CFG’s
puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir una producción sin look ahead
• Hay varias técnicas
– Cada una puede manejar algunas CFG’s
– Categorización de las técnicas

Oscar Bonilla 81 Universidad Galileo


Implementando un Parser
• Implementar un parser para algunas CFG’s
puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir una producción sin look ahead
• Hay varias técnicas
– Cada una puede manejar algunas CFG’s
– Categorización de las técnicas
( )

Oscar Bonilla 82 Universidad Galileo


Implementando un Parser
• Implementar un parser para algunas CFG’s
puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir una producción sin look ahead
• Hay varias técnicas
– Cada una puede manejar algunas CFG’s
– Categorización de las técnicas
( )
L - parsear de izquierda a derecha
R – parsear de derecha a izquierda

Oscar Bonilla 83 Universidad Galileo


Implementando un Parser
• Implementar un parser para algunas CFG’s
puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir una producción sin look ahead
• Hay varias técnicas
– Cada una puede manejar algunas CFG’s
– Categorización de las técnicas
( )
L - leftmost derivation
R - rightmost derivation

Oscar Bonilla 84 Universidad Galileo


Implementando un Parser
• Implementar un parser para algunas CFG’s
puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir una producción sin look ahead
• Hay varias técnicas
– Cada una puede manejar algunas CFG’s
– Categorización de las técnicas
( )
Número de caracteres de lookahead

Oscar Bonilla 85 Universidad Galileo


Implementando un Parser
• Implementar un parser para algunas CFG’s
puede ser muy difícil
– Tenemos que ver el input y elegir una producción
– No podemos elegir una producción sin look ahead
• Hay varias técnicas
– Cada una puede manejar algunas CFG’s
– Categorización de las técnicas
( )
– Ejemplos: LL(0), LR(1)

Oscar Bonilla 86 Universidad Galileo


Siguiente Clase
• Cómo implementar un Parser
• Cómo construir un parser engine
para un parser shift-reduce
• Vamos a ver
– LR(0) Parser
Engine
– LR(1)
– LALR(1)

Oscar Bonilla 87 Universidad Galileo


Resumen
• Qué es análisis sintáctico?
• Diferencia entre análisis léxico y análisis
sintáctico
• Gramáticas libres de contexto
• Arboles de Parseo
• Derivaciones left-most y right-most
• Top-down and bottom-up parsing
• Gramáticas Ambiguas
• Implementación de Parsers
Oscar Bonilla 88 Universidad Galileo
Grupos
• Ya tienen que tener grupos
• Si no tienen grupo todavía, hagánlo!
• Los listados de grupos van a estar en el Web

• Si no están en un grupo en el Web hablen con


Andreaq

Oscar Bonilla 89 Universidad Galileo

Vous aimerez peut-être aussi