Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
otros:antlr [2013/01/28 20:48] alfred [Sección @members] |
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 105: | Línea 151: | ||
| [...] | [...] | ||
| calculate_mw returns [float mw] | calculate_mw returns [float mw] | ||
| - | @init { | + | @init { $mw = 0.0 } |
| - | $mw = 0.0 | + | : (species { $mw += $species.species_weight})* EOF ; |
| - | } | + | |
| - | : (species { $mw += $species.species_weight})* EOF | + | |
| - | ; | + | |
| [...] | [...] | ||
| *** Fichero de código ************* | *** Fichero de código ************* | ||
| Línea 120: | 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 126: | 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 134: | 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 === | ||