Gestão de Atributos e Valor do Token

Na análise léxica, identificar um token muitas vezes não é suficiente. Para tokens como identificadores e literais, o compilador precisa saber o valor real que eles carregam. Essa informação extra é chamada de Atributo Semântico.

6.1 - O que é o yylval?

O yylval é uma variável global utilizada para passar o valor semântico de um token do Analisador Léxico (Flex) para o Analisador Sintático (Bison).

Por padrão, o yylval armazena apenas inteiros, mas em compiladores reais ele é definido como uma Union em C, permitindo que ele transporte diferentes tipos de dados simultaneamente.

6.2 - Estrutura da Union (Exemplo)

No analisador sintático, definimos os tipos de dados que o yylval pode carregar:

%union {
    int ival;      // Para números inteiros
    float fval;    // Para números decimais
    char cval;     // Para caracteres únicos
    char *sval;    // Para nomes de variáveis e strings
}

6.3 - Mapeamento de Atribuições

Sempre que o Flex reconhece um token que possui valor, ele deve preencher o campo correspondente do yylval antes de executar o return:

Token Campo de yylval Exemplo de Atribuição no Flex
TOK_INT_LIT ival yylval.ival = atoi(yytext);
TOK_FLOAT_LIT fval yylval.fval = atof(yytext);
TOK_CHAR_LIT cval yylval.cval = yytext[1];
TOK_ID cval yylval.sval = strdup(yytext);
TOK_STRING_LIT sval yylval.sval = strdup(yytext);

6.4 - Importância da Função strdup()

Para tokens que carregam texto (como nomes de variáveis ou frases), usamos a função strdup(yytext). Isso é necessário porque o Flex reutiliza o mesmo espaço de memória (yytext) para cada novo token encontrado. Se não duplicarmos a string, o valor do primeiro identificador será sobrescrito pelo próximo assim que ele for lido.

6.5 - Tokens sem Atributos

Tokens como palavras reservadas (TOK_IF, TOK_WHILE) e operadores (TOK_PLUS, TOK_SCOLON) geralmente não precisam preencher o yylval. Para o compilador, basta saber que o símbolo existe; o símbolo em si (ex: o caractere ;) não carrega um “valor” que precise ser processado matematicamente.


This site uses Just the Docs, a documentation theme for Jekyll.