SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
Cómo hacer un parser en Go
(y no morir en el intento)
Edgardo Hames - ehames@bitlogic.io
BITLOGIC.io
2 problemas y 1 concepto
./myprog -i 12 -m 10
Problema 1: Opciones de Programa
import "flag"
func main() {
var iterations, maxThreads int
flag.IntVar(&iterations, "i", 100, "number of iterations")
flag.IntVar(&maxThreads, "m", 4, "max number of threads")
...
flag.Parse()
...
}
Problema 2: Unmarshaling JSON
type Person struct {
ID string `json:“id”`
Name string `json:“name”`
}
{
“id”: “123”,
“name”: “Noam”
}
p := Person{ID: “123”, Name: “Noam”}
¿Qué es un parser?
Análizador sintáctico de una cadena
de símbolos conforme a un conjunto
de reglas gramaticales.
Del latín pars orationis (categorías
gramaticales)
Otros problemas que involucran análisis sintáctico
● Evaluación de expresiones
○ “2 +3 *5”
● Compilación de un programa
● Interpretación de scripts
○ Ruby, Python, Perl
○ Maven, Gradle
○ Gherkin (Godog, Jbehave, etc),
Parser
“2 +3 *5”
+
2 *
3 5
Los espacios
blancos son
basura
Análisis lexicográfico (lexer)
Convierte cadena de entrada en secuencia de tokens.
“2 +3 *5”
Token Categoría
2 Literal entero
+ Operador adición
3 Literal entero
* Operador multiplicación
5 Literal entero
Lexer
Parser
“2 +3 *5”
[“2”, “+”, “3”, “*”,“5”]
+
2 *
3 5
Cómo hacer un lexer y un
parser en Go
(y no morir en el intento)
Edgardo Hames - ehames@bitlogic.io
BITLOGIC.io
Lexer
Parser
Evaluador
“2 +3 *5”
[“2”, “+”, “3”, “*”, “5”]
30
+
2 *
3 5
Cómo hacer un lexer, un
parser y un evaluador en Go
(y no morir en el intento)
Edgardo Hames - ehames@bitlogic.io
BITLOGIC.io
Teoría
Gramáticas Generativas
Conjunto de reglas recursivas
que generan todas las cadenas
de un lenguaje.
Chomsky, 1956
Ejemplo de Gramática Generativa
¿Es válido el siguiente programa?
if (a > 3) then
b := true
else
b := false
ALT <- IF cond THEN statement |
IF cond THEN statement ELSE statement
IF <- “if”
THEN <- “then”
ELSE <- “else”
...
● Meta-reglas
○ “Si se puede interpretar como una sentencia o una definición, preferir la definición” (C++)
○ “Preferir la coincidencia más larga” (Haskell)
¿Cómo eliminar la ambigüedad?
El tiempo de ejecución
puede ser exponencial en
el peor caso.
Gramáticas Analíticas
Conjunto de reglas que deciden si una cadena pertenece a un lenguaje.
Parsing Expression Grammars
● Son gramáticas analíticas
● Tienen notación similar a EBNF
● Introducen el operador de elección con
prioridad /
● Resuelven el problema de lexing y parsing
Bryan Ford, 2004
Reglas
ε => Reconoce la cadena vacía.
a => Reconoce el símbolo terminal a.
A => Reconoce el símbolo no terminal A.
e1 e2 => Reconoce e1 seguida inmediatamente de e2.
e1/e2 => Reconoce e1. Si falla, intenta con e2.
e* => Reconoce cero o más repeticiones de e.
!e => Reconoce que no sigue la expresión e (no mueve el punto de lectura).
Hay varias reglas más que son syntactic sugar de éstas. Por ej. e+
alt <- IF cond THEN statement ELSE statement /
IF cond THEN statement
IF <- “if”
THEN <- “then”
ELSE <- “else”
...
PEG al rescate
PEG => Packrat Parser
Parser en tiempo lineal
que usa memoization
Búsqueda de documentos (símil Google)
w1 w2 … wn => encuentra los textos que contengan alguna palabra
“w1 w2…” => encuentra los textos que contengan todas las palabras
-w1 => encuentra los textos que no contengan w1
Implementación de PEG en Go
$ go get github.com/pointlander/peg
$ peg -inline -switch expression/expression.peg
Show me the Code
Conclusiones
● El problema del análisis sintáctico no tiene solución trivial
● Las PEGs proveen una solución eficiente
● Hay implementaciones de PEG en la mayoría de los lenguajes
¿Preguntas?
Agradecimientos
● Gustavo Burgi (G-SE)
● Federico Aguirre (Bitlogic)

Más contenido relacionado

La actualidad más candente (20)

Clase de logica posbc
Clase de logica posbcClase de logica posbc
Clase de logica posbc
 
Claselexico
ClaselexicoClaselexico
Claselexico
 
Programacion en java
Programacion en javaProgramacion en java
Programacion en java
 
Tema 3 sentencias de control de java por gio
Tema 3   sentencias de control de java por gioTema 3   sentencias de control de java por gio
Tema 3 sentencias de control de java por gio
 
Clase6 conceptos del analisis lexico
Clase6 conceptos del analisis lexicoClase6 conceptos del analisis lexico
Clase6 conceptos del analisis lexico
 
Actividad 3
Actividad 3Actividad 3
Actividad 3
 
Sintaxis Y Gramatica
Sintaxis Y GramaticaSintaxis Y Gramatica
Sintaxis Y Gramatica
 
Expo long
Expo longExpo long
Expo long
 
Sistemas de tipos: Lo bueno, lo malo y lo feo
Sistemas de tipos: Lo bueno, lo malo y lo feoSistemas de tipos: Lo bueno, lo malo y lo feo
Sistemas de tipos: Lo bueno, lo malo y lo feo
 
Recursividad - Vanessa Ramirez
Recursividad - Vanessa RamirezRecursividad - Vanessa Ramirez
Recursividad - Vanessa Ramirez
 
Clase 3
Clase 3Clase 3
Clase 3
 
Automatas finitos
Automatas finitosAutomatas finitos
Automatas finitos
 
Cuadro comparativo de metodos de busqueda en ia
Cuadro comparativo de metodos de busqueda en iaCuadro comparativo de metodos de busqueda en ia
Cuadro comparativo de metodos de busqueda en ia
 
Polinomios interpolantes
Polinomios interpolantesPolinomios interpolantes
Polinomios interpolantes
 
Análisis lexicográfico
Análisis lexicográficoAnálisis lexicográfico
Análisis lexicográfico
 
Matlab 2
Matlab 2Matlab 2
Matlab 2
 
Analizador léxico
Analizador léxicoAnalizador léxico
Analizador léxico
 
Clase15
Clase15Clase15
Clase15
 
Pseudocodigo
PseudocodigoPseudocodigo
Pseudocodigo
 
Resolubilidad
ResolubilidadResolubilidad
Resolubilidad
 

Similar a Cómo hacer un parser en Go

Similar a Cómo hacer un parser en Go (20)

Programación en C#.pptx
Programación en C#.pptxProgramación en C#.pptx
Programación en C#.pptx
 
04 j flex
04 j flex04 j flex
04 j flex
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Analisis Sintactico
Analisis SintacticoAnalisis Sintactico
Analisis Sintactico
 
Taller completo
Taller completoTaller completo
Taller completo
 
Introduccion a la programación
Introduccion a la programaciónIntroduccion a la programación
Introduccion a la programación
 
Lenguaje latino
Lenguaje latinoLenguaje latino
Lenguaje latino
 
PHP
PHPPHP
PHP
 
Estructura general del programa
Estructura general del programaEstructura general del programa
Estructura general del programa
 
Introducción a dr racket
Introducción a dr racketIntroducción a dr racket
Introducción a dr racket
 
Unidad4 analisis-semantico
Unidad4 analisis-semanticoUnidad4 analisis-semantico
Unidad4 analisis-semantico
 
algoritmos.pdf
algoritmos.pdfalgoritmos.pdf
algoritmos.pdf
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Fundamentos De Algoritmia
Fundamentos De AlgoritmiaFundamentos De Algoritmia
Fundamentos De Algoritmia
 
C curso intr
C curso intr C curso intr
C curso intr
 
Tipos de datos abstractos
Tipos de datos abstractosTipos de datos abstractos
Tipos de datos abstractos
 
TIPOS DE DATOS MATLAB
TIPOS DE DATOS MATLABTIPOS DE DATOS MATLAB
TIPOS DE DATOS MATLAB
 
Generación código intermedio 2
Generación código intermedio 2Generación código intermedio 2
Generación código intermedio 2
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
 

Cómo hacer un parser en Go

  • 1. Cómo hacer un parser en Go (y no morir en el intento) Edgardo Hames - ehames@bitlogic.io BITLOGIC.io
  • 2. 2 problemas y 1 concepto
  • 3. ./myprog -i 12 -m 10 Problema 1: Opciones de Programa import "flag" func main() { var iterations, maxThreads int flag.IntVar(&iterations, "i", 100, "number of iterations") flag.IntVar(&maxThreads, "m", 4, "max number of threads") ... flag.Parse() ... }
  • 4. Problema 2: Unmarshaling JSON type Person struct { ID string `json:“id”` Name string `json:“name”` } { “id”: “123”, “name”: “Noam” } p := Person{ID: “123”, Name: “Noam”}
  • 5. ¿Qué es un parser? Análizador sintáctico de una cadena de símbolos conforme a un conjunto de reglas gramaticales. Del latín pars orationis (categorías gramaticales)
  • 6. Otros problemas que involucran análisis sintáctico ● Evaluación de expresiones ○ “2 +3 *5” ● Compilación de un programa ● Interpretación de scripts ○ Ruby, Python, Perl ○ Maven, Gradle ○ Gherkin (Godog, Jbehave, etc),
  • 7. Parser “2 +3 *5” + 2 * 3 5 Los espacios blancos son basura
  • 8. Análisis lexicográfico (lexer) Convierte cadena de entrada en secuencia de tokens. “2 +3 *5” Token Categoría 2 Literal entero + Operador adición 3 Literal entero * Operador multiplicación 5 Literal entero
  • 9. Lexer Parser “2 +3 *5” [“2”, “+”, “3”, “*”,“5”] + 2 * 3 5
  • 10. Cómo hacer un lexer y un parser en Go (y no morir en el intento) Edgardo Hames - ehames@bitlogic.io BITLOGIC.io
  • 11. Lexer Parser Evaluador “2 +3 *5” [“2”, “+”, “3”, “*”, “5”] 30 + 2 * 3 5
  • 12. Cómo hacer un lexer, un parser y un evaluador en Go (y no morir en el intento) Edgardo Hames - ehames@bitlogic.io BITLOGIC.io
  • 13.
  • 15. Gramáticas Generativas Conjunto de reglas recursivas que generan todas las cadenas de un lenguaje. Chomsky, 1956
  • 16. Ejemplo de Gramática Generativa ¿Es válido el siguiente programa? if (a > 3) then b := true else b := false ALT <- IF cond THEN statement | IF cond THEN statement ELSE statement IF <- “if” THEN <- “then” ELSE <- “else” ...
  • 17. ● Meta-reglas ○ “Si se puede interpretar como una sentencia o una definición, preferir la definición” (C++) ○ “Preferir la coincidencia más larga” (Haskell) ¿Cómo eliminar la ambigüedad?
  • 18. El tiempo de ejecución puede ser exponencial en el peor caso.
  • 19.
  • 20. Gramáticas Analíticas Conjunto de reglas que deciden si una cadena pertenece a un lenguaje.
  • 21. Parsing Expression Grammars ● Son gramáticas analíticas ● Tienen notación similar a EBNF ● Introducen el operador de elección con prioridad / ● Resuelven el problema de lexing y parsing Bryan Ford, 2004
  • 22. Reglas ε => Reconoce la cadena vacía. a => Reconoce el símbolo terminal a. A => Reconoce el símbolo no terminal A. e1 e2 => Reconoce e1 seguida inmediatamente de e2. e1/e2 => Reconoce e1. Si falla, intenta con e2. e* => Reconoce cero o más repeticiones de e. !e => Reconoce que no sigue la expresión e (no mueve el punto de lectura). Hay varias reglas más que son syntactic sugar de éstas. Por ej. e+
  • 23. alt <- IF cond THEN statement ELSE statement / IF cond THEN statement IF <- “if” THEN <- “then” ELSE <- “else” ... PEG al rescate
  • 24. PEG => Packrat Parser Parser en tiempo lineal que usa memoization
  • 25.
  • 26.
  • 27. Búsqueda de documentos (símil Google) w1 w2 … wn => encuentra los textos que contengan alguna palabra “w1 w2…” => encuentra los textos que contengan todas las palabras -w1 => encuentra los textos que no contengan w1
  • 28. Implementación de PEG en Go $ go get github.com/pointlander/peg $ peg -inline -switch expression/expression.peg
  • 29. Show me the Code
  • 30. Conclusiones ● El problema del análisis sintáctico no tiene solución trivial ● Las PEGs proveen una solución eficiente ● Hay implementaciones de PEG en la mayoría de los lenguajes
  • 32. Agradecimientos ● Gustavo Burgi (G-SE) ● Federico Aguirre (Bitlogic)