viernes, 15 de diciembre de 2017

Practica PL1 (2017-2018): Parte 1: Analizador lexico (II)

Como escribia ayer, hoy toca reconocer los lexemas correspondientes a los elementos que no son palabras reservadas. Esto son los identificadores, cadenas y numeros, asi como a los saltos de linea.

Empezaremos con los identificadores. Un identificador está formado por una cadena de caracteres (letras y numeros) de cualquier longitud que comienza con una letra.

Para ello definimos que LETRA es [a-zA-Z] y que DIGITO es [0-9].

Entonces IDENTIFICADOR es, tal y como se debe escribir en el scanner.jflex

IDENTIFICADOR = {LETRA}{DIGITO|LETRA}*

Esto solo es a la hora de definir, mas adelante tendremos que agregar la linea

{IDENTIFICADOR} {return nuevoToken(sym.IDENTIFICADOR);}

Podriamos sustituir {IDENTIFICADOR} por {LETRA}{DIGITO|LETRA}*, pero no es tan intuitivo. O incluso [a-zA-Z]([a-zA-Z]|[0-9])*, pero lo es todavía menos.

Los numeros se definen de una manera similar. Podemos definir perfectamente como NUMERO la cadena {DIGITO}+ dado que no hay ninguna restriccion sobre el numero 0 al principio, es decir, admitir como valido 017. En un lenguaje "bien hecho" equivaldria a un numero octal, pero aqui da lo mismo.

Podemos usar, si queremos hacer las cosas mas complicadas, que NUMERO sea 0 o una cadena de digitos, lo que sería (0|[0-9]+).

Yo en mi practica en vez de usar NUMERO usé CONSTANTE_NUMERICA, que para el caso es lo mismo. Así de retorcido soy.

Lo siguiente son las cadenas de caracteres. Una cadena de caracteres está formada por dos comillas y entre ellas cualquier numero de caracteres (incluyendo la cadena vacia y espacios).

Es bastante sencillo adaptar eso a regex: \".*\"

No olvideis que hay que agregar tambien una linea de return nuevoToken.

Por ultimo, los saltos de linea y espacios: ESPACIO_BLANCO=[ \t\r\n\f]

En este caso, espacio en blanco no devuelve token, con lo que podeis eliminear el return nuevoToken. Si quereis podeis poner System.out.println("Detectado espacio en blanco") o algo parecido en su lugar, pero yo lo dejaría en blanco, para no liaros.



A proposito, que no lo dije. Teneis tambien dos opciones para mas adelante. Podeis definir un token := como un token llamado ASIGNACION (o ASIGN, ASIG o algo parecido) o podeis usar en el analisis sintactico DOS_PUNTOS IGUAL, como os sea mas simple.

Lo mismo si quereis usar <> o MENOR_QUE MAYOR_QUE

<= o >= no están definidos por el equipo docente, asi que no es necesario añadirlo.

Si habeis pensado en vaguear un poco, se os habrá pasado por la cabeza definir <, >, = y  <> con un unico token y llamarlo COMPARACION. No os lo recomiendo, porque = tambien se utiliza para dar valor a las constantes (no se usa :=). No compensa.

Si que podeis hacerlo con el +, -, * y /, con un token OPERACION_ARITMETICA, ya que ninguno de esos tokens se reutilizan.

En cuanto a tokens que no se utilizan, podeis suprimir el ' (comilla simple). No se usa en el lenguaje y sospecho que copiaron la tabla de un enunciado anterior o que quisieron agregar los caracteres individuales.



Pues con esto ya hemos acabado por hoy. En la proxima entrega, la ultima del léxico, como se detectan los comentarios bien balanceados.

Un saludo.

No hay comentarios:

Publicar un comentario