Saltar al contenido

¿Cuál es la diferencia entre un token y un lexema?

Posteriormente a consultar con especialistas en este tema, programadores de deferentes ramas y profesores hemos dado con la respuesta al problema y la compartimos en este post.

Solución:

Uso de “Principios, técnicas y herramientas de los compiladores, 2ª ed.” (WorldCat) de Aho, Lam, Sethi y Ullman, también conocido como el Libro del Dragón Púrpura,

Lexeme pág. 111

Un lexema es una secuencia de caracteres en el programa fuente que coincide con el patrón de un token y es identificado por el analizador léxico como una instancia de ese token.

Token pág. 111

Un token es un par que consta de un nombre de token y un attribute
valor. El nombre del token es un símbolo abstracto que representa una especie de unidad léxica, por ejemplo, una palabra clave en particular o una secuencia de caracteres de entrada que denota un identificador. Los nombres de los tokens son los símbolos de entrada que procesa el analizador.

Patrón pág. 111

Un patrón es una descripción de la forma que pueden tomar los lexemas de una ficha. En el caso de una palabra clave como token, el patrón es solo la secuencia de caracteres que forman la palabra clave. Para los identificadores y algunos otros tokens, el patrón es una estructura más compleja que coincide con muchas cadenas.

Figura 3.2: Ejemplos de tokens pág.112

[Token]       [Informal Description]                  [Sample Lexemes]
if            characters i, f                         if
else          characters e, l, s, e                   else
comparison    < or > or <= or >= or == or !=          <=, !=
id            letter followed by letters and digits   pi, score, D2
number        any numeric constant                    3.14159, 0, 6.02e23
literal       anything but ", surrounded by "'s       "core dumped"

Para comprender mejor esta relación con un analizador léxico y un analizador, comenzaremos con el analizador y trabajaremos hacia atrás hasta la entrada.

Para facilitar el diseño de un analizador, un analizador no trabaja directamente con la entrada, sino que toma una lista de tokens generados por un lexer. Mirando la columna de tokens en la Figura 3.2 vemos tokens como if, else, comparison, id, number y literal; estos son nombres de tokens. Por lo general, con un lexer / parser, un token es una estructura que contiene no solo el nombre del token, sino también los caracteres / símbolos que componen el token y la posición inicial y final del string de caracteres que componen el token, con la posición inicial y final que se utilizan para informar de errores, resaltar, etc.

Ahora el lexer toma la entrada de caracteres / símbolos y, usando las reglas del lexer, convierte los caracteres / símbolos de entrada en tokens. Ahora las personas que trabajan con lexer / parser tienen sus propias palabras para las cosas que usan con frecuencia. Lo que usted considera una secuencia de caracteres / símbolos que componen un token es lo que las personas que usan lexer / parsers llaman lexema. Entonces, cuando vea lexema, solo piense en una secuencia de caracteres / símbolos que representan un token. En el ejemplo de comparación, la secuencia de caracteres / símbolos puede tener diferentes patrones, como < o > o else o 3.14etc.

Otra forma de pensar en la relación entre los dos es que un token es una estructura de programación utilizada por el analizador que tiene una propiedad llamada lexema que contiene los caracteres / símbolos de la entrada. Ahora bien, si observa la mayoría de las definiciones de token en el código, es posible que no vea el lexema como una de las propiedades del token. Esto se debe a que es más probable que un token mantenga la posición inicial y final de los caracteres / símbolos que representan el token y el lexema, la secuencia de caracteres / símbolos se puede derivar de la posición inicial y final según sea necesario porque la entrada es static.

Cuando se introduce un programa fuente en el analizador léxico, comienza dividiendo los caracteres en secuencias de lexemas. Los lexemas se utilizan luego en la construcción de tokens, en los que los lexemas se mapean en tokens. Una variable llamada myVar se mapearía en un token que indicaidentificación, "num">, donde "num" debe apuntar a la ubicación de la variable en la tabla de símbolos.

En pocas palabras:

  • Los lexemas son las palabras derivadas del flujo de entrada de caracteres.
  • Los tokens son lexemas mapeados en un nombre de token y un attribute-valor.

Un ejemplo incluye:
x = a + b * 2
Lo que produce los lexemas: x, =, a, +, b, *, 2
Con los tokens correspondientes: identificación, 0>, <=>,identificación, 1>, <+>,identificación, 2>, <*>,identificación, 3>

a) Los tokens son nombres simbólicos de las entidades que componen el texto del programa; por ejemplo, si para la palabra clave si, e id para cualquier identificador. Estos constituyen la salida del analizador léxico. 5

(b) Un patrón es una regla que especifica cuándo una secuencia de caracteres de la entrada constituye un token; por ejemplo, la secuencia i, f para el token if, y cualquier secuencia alfanumérica que comience con una letra para el identificador del token.

(c) Un lexema es una secuencia de caracteres de la entrada que coinciden con un patrón (y por lo tanto constituyen una instancia de un token); por ejemplo, si coincide con el patrón de if, y foo123bar coincide con el patrón de id.

Puntuaciones y comentarios

Si estás contento con lo expuesto, puedes dejar un artículo acerca de qué te ha parecido esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *