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/30 17:12] alfred [Sección @rulecatch] |
otros:antlr [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 63: | Línea 63: | ||
| raw_input() | 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> | </code> | ||
| ===== Notas ===== | ===== Notas ===== | ||
| Línea 84: | Línea 106: | ||
| * 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 140: | Línea 170: | ||
| | defvar { print 'var' } | | defvar { print 'var' } | ||
| | .* { print 'lodemas' } ; | | .* { 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 147: | Línea 184: | ||
| * {{:otros:antlr:antlr_python.pdf|Ejemplo con Python}} | * {{:otros:antlr:antlr_python.pdf|Ejemplo con Python}} | ||
| * {{:otros:antlr:antlr-tutorial.pdf|Tutorial}} | * {{:otros:antlr:antlr-tutorial.pdf|Tutorial}} | ||
| + | |||
| + | ==== Ejemplos míos ==== | ||
| + | * {{:otros:antlr:gamelog.g.zip|GameLog v0}} | ||
| ==== Links ==== | ==== Links ==== | ||
| === General === | === General === | ||