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 20:49]
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 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.
 +  * 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'':​ 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>​
Línea 117: Línea 163:
     return parser.calculate_mw()     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 123: 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 131: 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.1359406152.txt.gz · Última modificación: 2020/05/09 09:25 (editor externo)