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 10:54] alfred [Apuntes] |
otros:antlr [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 56: | 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 72: | 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 128: | 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 135: | 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 === | ||