Skip to content

Implementación

Ahora hay que implementar una función que lea caracteres de un flujo y determine, mediante la implementación de los patrones, a qué categoría pertenece cada uno. Aunque se podría hacer fácilmente a mano, para acelerar el proceso se utilizará la herramienta Antlr.

Escribir la Especificación en formato Antlr

El primer paso es darle la información anterior (qué tokens hay en el lenguaje y qué patrón tiene cada uno) en el formato de la herramienta. En la carpeta /specifications/ está tiene el fichero Tokenizer.g4 con un esqueleto de un fichero de Antlr con todo el código habitual de cualquier analizador léxico. Sólo habría que añadir las reglas específicas de MLang:

java
lexer grammar Tokenizer;

DATA: 'DATA';
CODE: 'CODE';

PRINT: 'print';

INT: 'int';
FLOAT: 'float';

INT_LITERAL: [0-9]+;
FLOAT_LITERAL: [0-9]+ '.' [0-9]+;

IDENT: [a-zA-Z][a-zA-Z0-9_]*;

PLUS: '+';
MULT: '*';
SUB: '-';
DIV: '/';

ASSIGNMENT: '=';
SEMICOLON: ';';

OPEN_PARENTHESIS: '(';
CLOSE_PARENTHESIS: ')';

LINE_COMMENT: '//' .*? '\r'? ('\n' | EOF) -> skip;
MULTILINE_COMMENT: '/*' .*? '*/' -> skip;

WHITESPACE: [ \t\r\n]+ -> skip;

Generación del código Java

Una vez completado el fichero Tokenizer.g4, solo quedaría usar Antlr para que genere el código en Java del analizador léxico.

bash
c:\mlang> antlr.bat

Aparecerá así un fichero /src/parser/GrammarLexer.java que contendrá el código en Java que, siguiendo las expresiones regulares, clasifica la entrada en tokens.

WARNING

Información para usuarios de Eclipse. Hay veces en que eclipse no detecta el cambio en un fichero generado por una herramienta y, por tanto, seguirá compilando la versión antigua del mismo. Si esto ocurre, debe seleccionarse el proyecto en la ventana Package Explorer y pulsar F5 para actualizar. En ocasiones, habrá incluso que repetir la pulsación de F5 varias veces.

TIP

Habrá que invocar a antlr.bat cada vez que se modifique el fichero Tokenizer.g4 o Grammar.g4 para que Antlr genere la versión actualizada del analizador léxico o sintáctico. En este tutorial se indicará cada vez que sea necesario hacer esto. Sin embargo, se recomienda que se automatice este proceso en el entorno de desarrollo elegido por el alumno.

Por ejemplo, usando maven, se puede añadir el plugin de Antlr para que se ejecute cada vez que se compila el proyecto. En Visual Studio Code se puede instalar la extensión de Antlr y configurarla para que ejecute Antlr cada vez que se guarde modifique el léxico o el sintáctico.