Herramientas de usuario

Herramientas del sitio


otros:antlr

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
otros:antlr [2013/01/28 19:05]
alfred [Apuntes]
otros:antlr [2020/05/09 09:25] (actual)
Línea 4: Línea 4:
     * {{otros:​antlr:​antlrworks-1.4.tar|ANTLRWorks,​ una IDE de desarrollo}}.     * {{otros:​antlr:​antlrworks-1.4.tar|ANTLRWorks,​ una IDE de desarrollo}}.
     * {{otros:​antlr:​dot-net-runtime-3.1.3.zip|Librerías para .NET}}.     * {{otros:​antlr:​dot-net-runtime-3.1.3.zip|Librerías para .NET}}.
 +    * {{otros:​antlr:​antlr3-completepack.zip|Utilizado para trabajar con él}}.
 +    * {{:​otros:​antlr:​examples.zip|Ejemplos}}
   * **Links**   * **Links**
     * [[http://​www.antlr.org/​|Página oficial]].     * [[http://​www.antlr.org/​|Página oficial]].
Línea 44: Línea 46:
  
 ==== Sección @members ==== ==== Sección @members ====
 +Código que se añadirá al parser generado (aquí podremos poner nuestras funciones dentro de la clase).
 ==== Sección @rulecatch ==== ==== Sección @rulecatch ====
 Cada regla de un parser es convertida a una llamada a un método dentro de un bloque ''​try - catch''​. Podemos definir el bloque ''​catch''​ a partir de esta sección: Cada regla de un parser es convertida a una llamada a un método dentro de un bloque ''​try - catch''​. Podemos definir el bloque ''​catch''​ a partir de esta sección:
Línea 54: Línea 56:
 } }
 </​code>​ </​code>​
 +O en Python: 
 +<​code>​ 
 +@rulecatch{ 
 +except RecognitionException,​ e:  
 +  print '​ERROR!!!!',​  
 +  raw_input() 
 +
 +</​code>​ 
 +==== Sección @init ==== 
 +Para inicializar valores dentro de la clase del parser: 
 +<​code>​ 
 +@init { 
 +    self.line = {} 
 +    self.line['​parameters'​] = {} 
 +
 +</​code>​ 
 +Luego podremos usarlas así: 
 +<​code>​ 
 +logline returns [val] 
 +    : globalmessage {val = self.line} 
 +    | playerinfo {val = self.line} 
 +    ; 
 +</​code>​ 
 +Las reglas también pueden tener un init: 
 +<​code>​ 
 +file returns [List<​List<​String>>​ data] 
 +@init {data = new ArrayList<​List<​String>>​();​} 
 +  :  (row {data.add($row.list);​})+ EOF 
 +  ; 
 +</​code>​
 ===== Notas ===== ===== Notas =====
 ==== Apuntes ==== ==== Apuntes ====
 +
 +Para ejecutar antlr3 haremos:
 +<​code>​
 +$ java org.antlr.Tool -o ./out/ GameLog.g ​
 +</​code>​
 === Signos de gramática === === Signos de gramática ===
 | Signos | Significado | | Signos | Significado |
Línea 63: Línea 99:
 |+| Ha de existir al menos una vez | |+| Ha de existir al menos una vez |
 |?| Opcional | |?| Opcional |
 +|~| Negación |
 |(<​nowiki>​x|y|z</​nowiki>​)| Regla x, y o z | |(<​nowiki>​x|y|z</​nowiki>​)| Regla x, y o z |
 +| EOF | Final de línea |
 === Pequeños apuntes === === Pequeños apuntes ===
   * Se distinguen los identificadores en mayúsculas (reglas de parser que permiten devolver elementos) de minúsculas (tokens léxicos).   * Se distinguen los identificadores en mayúsculas (reglas de parser que permiten devolver elementos) de minúsculas (tokens léxicos).
   * AntlrWorks es el IDE diseñado para montar gramáticas.   * AntlrWorks es el IDE diseñado para montar gramáticas.
   * Los tokens '​fragment'​ no son tokens pero sí que forman parte de otros.   * Los tokens '​fragment'​ no son tokens pero sí que forman parte de otros.
-Cuando tengamos varias reglas con las que case lo introducido podremos hacer alias de los tokens:+  * Existe el método ''​getNumberOfSyntaxErrors''​ en el objeto parser. Indicará los errores de parsing, pero si se hace un apartado ''​@rulecatch''​ estos serán ignorados. 
 +  * También pueden detectarse los errores en al ejecutarse una regla con ''​state.failed''​. 
 +Es importante definir antes lo que queremos que coincida: 
 +<​code>​ 
 +BEGIN : '​begin'​ ; 
 +ID : '​a'​..'​z'​ + ; 
 +OTHER: . ; // match any other single character 
 +</​code>​ 
 +Cuando tengamos varias reglas con las que case lo introducido podremos hacer alias de los tokens ​(si únicamente fuese uno podríamos hacer ''​$PLAYER.text''​:
 <​code>​ <​code>​
 infouser : COMS p1=PLAYER COMS VERB COMS p2=PLAYER COMS WITH COMS GUN COMS (PARENT1 parameter PARENT2)* { print 'oh! > ', $p1.text, $p2.text } infouser : COMS p1=PLAYER COMS VERB COMS p2=PLAYER COMS WITH COMS GUN COMS (PARENT1 parameter PARENT2)* { print 'oh! > ', $p1.text, $p2.text }
Línea 86: Línea 132:
 Lidiar con atributos opcionales: Lidiar con atributos opcionales:
 <​code>​ <​code>​
-species returns [int count] : atom DIGITS? { count = int($DIGITS.text) if $DIGITS else 0 } ;+species returns [int count] : atom DIGITS? { $count = int($DIGITS.text) if $DIGITS else 0 } ; 
 +</​code>​ 
 +Podemos retornar varios valores: 
 +<​code>​ 
 +foo returns [a, b, c] 
 +  :  A B C            {a=$A.text; b=$B.text; b=$C.text} 
 +  ; 
 +</​code>​ 
 +Podemos inicializar valores dentro de reglas con ''​@init'':​ 
 +<​code>​ 
 +calculate_mw returns [float mw] 
 +@init { $mw = 0.0 } 
 +: (species { $mw += $species.species_weight})* EOF ; 
 +</​code>​ 
 +Para aprovechar la salida de un parser podremos hacer: 
 +<​code>​ 
 +*** Fichero gramática (regla principal ''​) **** 
 +[...] 
 +calculate_mw returns [float mw] 
 +@init { $mw = 0.0 } 
 +: (species { $mw += $species.species_weight})* EOF ; 
 +[...] 
 +*** Fichero de código ************* 
 +[...] 
 +def calculate_mw(formula):​ 
 +    char_stream = antlr3.ANTLRStringStream(formula) 
 +    lexer = MWGrammarLexer(char_stream) 
 +    tokens = antlr3.CommonTokenStream(lexer) 
 +    parser = MWGrammarParser(tokens) 
 +    return parser.calculate_mw() 
 +[...] 
 +</​code>​ 
 +Para hacer coincidir otros elementos usaremos ''​.'':​ 
 +<​code>​ 
 +logline : globalmessage { print '​info'​ } 
 +        | rconcommand { print '​rcon'​ } 
 +        | defvar { print '​var'​ } 
 +        | .* { print '​lodemas'​ } ; 
 +</​code>​ 
 +Un ejemplo para capturar excepciones:​ 
 +<​code>​ 
 +except RecognitionException,​ e:  
 +  print "​PARSING ERROR: "​+str(e)+"​ parsing :"​+str(self.input) 
 +  pprint.pprint(e) 
 +  pprint.pprint(self.input)
 </​code>​ </​code>​
 Atributos de tokens: Atributos de tokens:
Línea 93: Línea 183:
   * {{otros:​antlr:​proyecto_fkscript.pdf|Ejemplo con C#}}.   * {{otros:​antlr:​proyecto_fkscript.pdf|Ejemplo con C#}}.
   * {{:​otros:​antlr:​antlr_python.pdf|Ejemplo con Python}}   * {{:​otros:​antlr:​antlr_python.pdf|Ejemplo con Python}}
 +  * {{:​otros:​antlr:​antlr-tutorial.pdf|Tutorial}}
 +
 +==== Ejemplos míos ====
 +  * {{:​otros:​antlr:​gamelog.g.zip|GameLog v0}}
 ==== Links ==== ==== Links ====
 === General === === General ===
Línea 101: Línea 195:
   * [[http://​www.antlr.org/​wiki/​display/​ANTLR3/​Expression+evaluator|Ejemplo]]   * [[http://​www.antlr.org/​wiki/​display/​ANTLR3/​Expression+evaluator|Ejemplo]]
   * [[http://​javadude.com/​articles/​antlr3xtut/​|Videotutoriales bastante completos]]   * [[http://​javadude.com/​articles/​antlr3xtut/​|Videotutoriales bastante completos]]
 +  * [[http://​www.antlr.org/​wiki/​display/​ANTLR3/​Tree+construction|Cómo crear árboles sintácticos]]
  
 === Python === === Python ===
otros/antlr.1359399954.txt.gz · Última modificación: 2020/05/09 09:25 (editor externo)