Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Parser Generators en Go

Parser Generators en Go

Presentada en GophersMX, el meetup de Go de la Ciudad de México.

Los parsers son herramientas poderosas para procesar input estructurado, pero son difíciles de desarrollar. Los parser generators hacen más accesible el costo de utilizar un parser para algún proyecto.

Arturo Vergara

October 14, 2016
Tweet

Other Decks in Programming

Transcript

  1. ¿Qué es un parser? Es un programa Analiza un stream

    (de caracteres, de bytes, etc) Los transforma en una estrcutura de datos (generalmente un Abstract Syntax Tree) Analiza la sintaxis a partir de una gramática (y da errores) El output se puede usar para otras cosas (e.g. compiladores) caracteres --- [parser] --> AST | + - - - > error
  2. Lexer y Parser Un parser es en realidad dos componentes:

    caracteres --- [lexer] --- tokens --- [parser] ---> AST | | + - - - - - - - - - - - + - - - > error
  3. El Lexer Es un programa Analiza un stream (de caracteres,

    de bytes, etc) Los agrupa en lexemes Convierte los lexemes en tokens El output se utiliza por el parser Token: Representación abstracta simbólica de un componente sintáctico del lenguaje "+" -> PLUS "-" -> MINUS "while" -> WHILE
  4. Context-Free Grammars Un CFG es un conjunto de reglas gramaticales

    que definen a una sintaxis. Productions Non-terminals Terminals
  5. Ejemplo Tomando la siguiente expresión: 1 + (2 - 3)

    + 123 Productions expression = value, {operation, value}; value = number, {number} | '(', expression, ')'; operation = '+' | '-'; number = '1' | '2' | '3'; Non-terminals expr, val, op, num Terminals +, -, 1, 2, 3
  6. Yacc Creado para UNIX por AT&T. Toma input generado por

    Lex (un generador de lexers) Sintaxis mezclada C + yacc GNU Bison es una alternativa libre go tool yacc es un port de la versión creada para Plan9
  7. El problema Quería aceptar especificaciones de targets en el formato

    nmap 10.0.0.1 10.0.0.0/24 10.0.0.* 10.0.0.1-10 10.0.0.1, 10.0.0.5-10, 192.168.1.*, 192.168.10.0/24
  8. CFG target list = target, {',', target}; target = address,

    ['/', number]; address = term, '.', term, '.', term, '.', term; term = number | range | '*'; range = number, '-', number; number = digit, {digit}; digit = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0';
  9. Demo package main import ( "log" "github.com/malfunkt/iprange" ) func main()

    { list, err := iprange.ParseList("10.0.0.1, 10.0.0.5-10, 192.168.1.*, 192.168.10.0/24") if err != nil { log.Printf("error: %s", err) } log.Printf("%+v", list) // rng := list.Expand() // log.Printf("%s", rng) }
  10. Conclusiones Los parsers son herramientas poderosas El costo de entrada

    es alto Los parser generators los hacen más accesibles
  11. Recursos Build Your Own LISP Daniel Holden buildyourownlisp.com (http://buildyourownlisp.com/) Compilers:

    Principles, Techniques, and Tools (2nd Edition) Alfred V. Aho, Jeffrey D. Ullman, Ravi Sethi amzn.com/0321486811 (https://amzn.com/0321486811) Bison 3.0.4 Manual bit.ly/bisonmanual (http://bit.ly/bisonmanual) go tool yacc golang.org/cmd/yacc/ (https://golang.org/cmd/yacc/)
  12. Thank you Arturo Vergara Developer, Mazing Studio [email protected] (mailto:[email protected]) https://arturovm.me

    (https://arturovm.me/) http://mazing.studio (http://mazing.studio/) @arturovm (http://twitter.com/arturovm)