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

86

En Compiler Construction de Aho Ullman y Sethi, se da que la cadena de caracteres de entrada del programa fuente se divide en una secuencia de caracteres que tienen un significado lógico, y se conocen como tokens y los lexemas son secuencias que componen el token, entonces, ¿qué Cuál es la diferencia básica?

usuario1707873
fuente

Respuestas:

118

Uso de " Principios, técnicas y herramientas de los compiladores, 2da edición " (WorldCat) de Aho, Lam, Sethi y Ullman, también conocido como Purple Dragon Book ,

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 el analizador léxico lo identifica como una instancia de ese token.

Token pág. 111

Un token es un par que consta de un nombre de token y un valor de atributo opcional. 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 token 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 lexer 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 funciona con la entrada directamente, sino que toma una lista de tokens generados por un lexer. En cuanto a la columna de contadores en la figura 3.2 vemos fichas tales como if, else, comparison, id, numbery literal; estos son nombres de tokens. Normalmente, con un lexer / parser, un token es una estructura que contiene no solo el nombre del token, sino los caracteres / símbolos que componen el token y la posición inicial y final de la cadena de caracteres que componen el token, con la La posición inicial y final se utiliza para informar de errores, resaltar, etc.

Ahora el lexer toma la entrada de caracteres / símbolos y, utilizando 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 piensa como 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 elseo 3.14, etc.

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 puede derivarse de la posición inicial y final según sea necesario porque la entrada es estática.

Guy Coder
fuente
12
En el uso del compilador coloquial, la gente tiende a usar los dos términos indistintamente. La distinción precisa es agradable, siempre y cuando la necesite.
Ira Baxter
Si bien no es una definición puramente informática, aquí hay una del procesamiento del lenguaje natural que es de relevancia de Introducción a la semántica léxica an individual entry in the lexicon
Guy Coder
Explicación absolutamente clara. Así es como deben explicarse las cosas en el cielo.
Timur Fayzrakhmanov
gran explicación. Tengo una duda más, también leí sobre la etapa de análisis, el analizador solicita tokens del analizador léxico, ya que el analizador no puede validar los tokens. ¿Puede explicarlo tomando una entrada simple en la etapa del analizador y cuándo el analizador solicita tokens de lexer?
Prasanna Sasne
@PrasannaSasne can you please explain by taking simple input at parser stage and when does parser asks for tokens from lexer.SO no es un sitio de discusión. Ésta es una pregunta nueva y debe plantearse como una pregunta nueva.
Guy Coder
36

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á en un token que indique < id , "num">, donde "num" debería 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 valor de atributo.


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

Guillermo
fuente
2
¿Se supone que es <id, 3>? porque 2 no es un identificador
Aditya
pero ¿dónde dice que x es un identificador? ¿Eso significa que una tabla de símbolos es una tabla de 3 columnas que tiene 'nombre' = x, 'tipo' = 'identificador (id)', puntero = '0' como una entrada en particular? entonces debe tener alguna otra entrada como 'nombre' = mientras, 'tipo' = 'palabra clave', puntero = '21 '??
8

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 token id.

(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.

Shasmoe
fuente
8

LEXEME - Secuencia de caracteres emparejados por PATRÓN que forman el TOKEN

PATRÓN : el conjunto de reglas que definen un TOKEN

TOKEN : la colección significativa de caracteres sobre el conjunto de caracteres del lenguaje de programación, por ejemplo: ID, constante, palabras clave, operadores, puntuación, cadena literal

sravan kumar
fuente
7

Lexeme - A lexema es una secuencia de caracteres en el programa de origen que coincida con el patrón para un contador y se identifica por el analizador léxico como una instancia de esa señal.

Token : el token es un par que consta de un nombre de token y un valor de token opcional. El nombre del token es una categoría de una unidad léxica. Los nombres comunes del token son

  • identificadores: nombres que elige el programador
  • palabras clave: nombres que ya están en el lenguaje de programación
  • separadores (también conocidos como puntuadores): caracteres de puntuación y delimitadores emparejados
  • operadores: símbolos que operan sobre argumentos y producen resultados
  • literales: numéricos, lógicos, textuales, literales de referencia

Considere esta expresión en el lenguaje de programación C:

suma = 3 + 2;

Tokenizado y representado por la siguiente tabla:

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement
Rajat Bhatt
fuente
5

Veamos el funcionamiento de un analizador léxico (también llamado Scanner)

Tomemos una expresión de ejemplo:

INPUT : cout << 3+2+3;

FORMATTING PERFORMED BY SCANNER :  {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;} 

aunque no la salida real.

EL ESCÁNER SIMPLEMENTE BUSCA REPETIDAMENTE UN LEXEME EN EL TEXTO DEL PROGRAMA FUENTE HASTA QUE SE AGOTE LA ENTRADA

Lexeme es una subcadena de entrada que forma una cadena de terminales válida presente en la gramática. Cada lexema sigue un patrón que se explica al final (la parte que el lector puede omitir al final)

(La regla importante es buscar el prefijo más largo posible que forme una cadena de terminales válida hasta que se encuentre el siguiente espacio en blanco ... explicado a continuación)

LEXEMES:

  1. cout
  2. <<

(aunque "<" también es una cadena de terminal válida, pero la regla mencionada anteriormente debe seleccionar el patrón para el lexema "<<" para generar el token devuelto por el escáner)

  1. 3
  2. +
  3. 2
  4. ;

TOKENS: Los tokens se devuelven uno a la vez (por el escáner cuando el analizador lo solicita) cada vez que el escáner encuentra un lexema (válido). El escáner crea, si aún no está presente, una entrada de tabla de símbolos (que tiene atributos: principalmente categoría de token y algunos otros) , cuando encuentra un lexema, para generar su token

'#' denota una entrada de tabla de símbolos. He señalado el número de lexema en la lista anterior para facilitar la comprensión, pero técnicamente debería ser un índice real de registro en la tabla de símbolos.

El analizador devuelve los siguientes tokens al analizador en el orden especificado para el ejemplo anterior.

  1. <identificador, n.º 1>

  2. <Operador, n.º 2>

  3. <Literal, n.º 3>

  4. <Operador, n.º 4>

  5. <Literal, n.º 5>

  6. <Operador, n.º 4>

  7. <Literal, n.º 3>

  8. <Puntuacionador, # 6>

Como puede ver la diferencia, un token es un par a diferencia del lexema, que es una subcadena de entrada.

Y el primer elemento del par es la clase / categoría de token

Las clases de tokens se enumeran a continuación:

  • PALABRAS CLAVE
  • IDENTIFICADORES
  • LITERALES
  • PUNTUADORES
  • OPERADORES
  • Y una cosa más, Scanner detecta espacios en blanco, los ignora y no forma ningún token para un espacio en blanco. No todos los delimitadores son espacios en blanco, un espacio en blanco es una forma de delimitador que utilizan los escáneres para su propósito. Las pestañas, las líneas nuevas, los espacios, los caracteres de escape en la entrada se denominan colectivamente delimitadores de espacios en blanco. Pocos otros delimitadores son ';' ',' ':' etc, que son ampliamente reconocidos como lexemas que forman token.

    El número total de tokens devueltos es 8 aquí, sin embargo, solo se hacen 6 entradas de tabla de símbolos para lexemas. Los lexemas también son 8 en total (ver definición de lexema)

    --- Puedes saltarte esta parte

    A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not.

    If a substring of input composed only of grammar terminals is following the rule specified by any of the listed patterns , it is validated as a lexeme and selected pattern will identify the category of lexeme, else a lexical error is reported due to either (i) not following any of the rules or (ii) input consists of a bad terminal-character not present in grammar itself.

    for example :
    
    1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .
    
    2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`
    
    Mayank narula
    fuente
    5

    Lexeme : un lexema es una cadena de caracteres que es la unidad sintáctica de nivel más bajo en el lenguaje de programación.

    Token : el token es una categoría sintáctica que forma una clase de lexemas, lo que significa a qué clase pertenece el lexema, si es una palabra clave, un identificador o cualquier otra cosa. Una de las principales tareas del analizador léxico es crear un par de lexemas y tokens, es decir, recopilar todos los personajes.

    Tomemos un ejemplo:

    si (y <= t)

    y = y-3;

    Token de Lexeme

    si PALABRA CLAVE

    (PARÉNTESIS IZQUIERDA

    y IDENTIFICADOR

    <= COMPARACIÓN

    t IDENTIFICADOR

    ) PARÉNTESIS DERECHA

    y IDENTIFICADOR

    = ASIGNACIÓN

    y IDENTIFICADOR

    _ ARITMÁTICA

    3 INTEGER

    ;                                    PUNTO Y COMA

    Relación entre Lexeme y Token

    Relación entre lexema y token

    coding_ninza
    fuente
    4

    Token: El tipo de (palabras clave, identificador, carácter de puntuación, operadores de varios caracteres) es, simplemente, un Token.

    Patrón: una regla para la formación de fichas a partir de caracteres de entrada.

    Lexeme: Es una secuencia de caracteres en el PROGRAMA FUENTE emparejados por un patrón para un token. Básicamente, es un elemento de Token.

    mud1t
    fuente
    3

    Token: Token es una secuencia de caracteres que se puede tratar como una única entidad lógica. Los tokens típicos son,
    1) identificadores
    2) palabras clave
    3) operadores
    4) símbolos especiales
    5) constantes

    Patrón: un conjunto de cadenas en la entrada para el que se produce el mismo token como salida. Este conjunto de cadenas se describe mediante una regla denominada patrón asociado con el token.
    Lexeme: un lexema es una secuencia de caracteres en el programa fuente que coincide con el patrón de un token.

    pradip
    fuente
    1

    Lexeme Se dice que los Lexemes son una secuencia de caracteres (alfanuméricos) en una ficha.

    Token Un token es una secuencia de caracteres que se puede identificar como una única entidad lógica. Normalmente, los tokens son palabras clave, identificadores, constantes, cadenas, símbolos de puntuación, operadores. números.

    Patrón Un conjunto de cadenas descritas por una regla llamada patrón. Un patrón explica qué puede ser un token y estos patrones se definen mediante expresiones regulares, que están asociadas al token.

    usuario10715886
    fuente
    1

    A los investigadores de informática, como los de matemáticas, les gusta crear términos "nuevos". Las respuestas anteriores son todas agradables, pero aparentemente, no hay una gran necesidad de distinguir tokens y lexemas en mi humilde opinión. Son como dos formas de representar lo mismo. Un lexema es concreto, aquí un conjunto de char; un token, por otro lado, es abstracto, generalmente se refiere al tipo de lexema junto con su valor semántico, si tiene sentido. Solo mis dos centavos.

    zell
    fuente
    0

    Lexical Analyzer toma una secuencia de caracteres, identifica un lexema que coincide con la expresión regular y lo categoriza aún más como token. Por lo tanto, un Lexeme es una cadena coincidente y un nombre de Token es la categoría de ese lexema.

    Por ejemplo, considere la siguiente expresión regular para un identificador con la entrada "int foo, bar;"

    letra (letra | dígito | _) *

    Aquí, fooy barcoincidir con la expresión regular son ambos lexemas, pero están categorizados como un token, IDes decir, un identificador.

    También tenga en cuenta que la siguiente fase, es decir, el analizador de sintaxis, no necesita conocer el lexema sino un token.

    vikram barandwal
    fuente
    -2

    Lexeme es básicamente la unidad de un token y es básicamente una secuencia de caracteres que coincide con el token y ayuda a dividir el código fuente en tokens.

    Por ejemplo: Si la fuente es x=b, a continuación, los lexemas serían x, =, by las fichas serían <id, 0>, <=>, <id, 1>.

    Subhasmit halder
    fuente
    La respuesta debería ser más específica. Un ejemplo puede resultar útil.
    Zverev Evgeniy