Usando " Compilers Principles, Techniques, & Tools, 2nd Ed. " (WorldCat) por Aho, Lam, Sethi e Ullman, também conhecido como o Livro do Dragão Roxo ,
Lexeme pg. 111
Um lexema é uma sequência de caracteres no programa de origem que corresponde ao padrão de um token e é identificado pelo analisador léxico como uma instância desse token.
Token pág. 111
Um token é um par que consiste em um nome de token e um valor de atributo opcional. O nome do token é um símbolo abstrato que representa um tipo de unidade lexical, por exemplo, uma palavra-chave específica ou sequência de caracteres de entrada denotando um identificador. Os nomes dos tokens são os símbolos de entrada que o analisador processa.
Padrão pág. 111
Um padrão é uma descrição da forma que os lexemas de um token podem assumir. No caso de uma palavra-chave como token, o padrão é apenas a sequência de caracteres que forma a palavra-chave. Para identificadores e alguns outros tokens, o padrão é uma estrutura mais complexa que é correspondida por muitas strings.
Figura 3.2: Exemplos de tokens pg.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 entender melhor essa relação com um lexer e um analisador, começaremos com o analisador e voltaremos para a entrada.
Para tornar mais fácil projetar um analisador, ele não funciona com a entrada diretamente, mas recebe uma lista de tokens gerados por um lexer. Olhando para a coluna de token na figura 3.2 podemos ver fichas tais como if
, else
, comparison
, id
, number
e literal
; esses são nomes de tokens. Normalmente, com um lexer / analisador, um token é uma estrutura que contém não apenas o nome do token, mas os caracteres / símbolos que o compõem e a posição inicial e final da string de caracteres que o compõe, com o posição inicial e final sendo usada para relatório de erros, realce, etc.
Agora, o lexer recebe a entrada de caracteres / símbolos e, usando as regras do lexer, converte os caracteres / símbolos de entrada em tokens. Agora, as pessoas que trabalham com lexer / parser têm suas próprias palavras para as coisas que usam com frequência. O que você pensa como uma sequência de caracteres / símbolos que compõem um token é o que as pessoas que usam lexer / parsers chamam de lexema. Então, quando você vir o lexema, pense apenas em uma sequência de caracteres / símbolos representando um token. No exemplo de comparação, a sequência de caracteres / símbolos pode ser diferentes padrões, como <
ou >
ou else
ou 3.14
, etc.
Outra maneira de pensar na relação entre os dois é que um token é uma estrutura de programação usada pelo analisador que possui uma propriedade chamada lexema que contém o caractere / símbolos da entrada. Agora, se você olhar para a maioria das definições de token no código, pode não ver lexema como uma das propriedades do token. Isso ocorre porque um token provavelmente manterá a posição inicial e final dos caracteres / símbolos que representam o token e o lexema, a sequência de caracteres / símbolos pode ser derivada da posição inicial e final conforme necessário porque a entrada é estática.