Pular para conteúdo

Literais e Comentários

Tokens

Segue abaixo a Tabela 1 contendo os tokens utilizados no compilador, além de suas expressões regulares e descrições. Essess tokens foram utilizados para representarem unidades léxicas, utilizados também como a menor elemento que é significativo para o compilador. Sendo assim, pensando em um conjunto de operações matemáticas, strings e operações da lógica da programação, optamos por selecionar os seguintes tokens:


Token Expressão regular correspondente Campo yyval Descrição
NUMBER [0-9]+ ou [0-9]+\.[0-9]+ numero Token genérico para literais numéricos. O campo yylval.numero armazena uma struct Numero que contém o tipo (TIPO_INT ou TIPO_FLOAT) e o valor já convertido.
STRING_LITERAL `"([^"\] \.)*"\'([^'\] Designado a identificação de strings.

Tabela 1: Tokens e suas respectivas expressões regulares. (Fonte: Mariana Letícia e Brunna Louise, 2025)

Comentários

Comentários são elementos fundamentais para organização e documentação, mas seu conteúdo não é relevante para a compilação. Portanto, eles são identificados e completamente ignorados pelo analisador léxico.

Tipo de comentário Expressão regular correspondente Descrição
Comentário de Linha "#".* Ignora todo o texto desde o caractere # até o final da linha.

Tabela 2: Tipos de comentários ignorados. (Fonte: Mariana Letícia e Brunna Louise, 2025)

Decisões técninas tomadas

Tratamento de Literais Numéricos

Durante a implementação, foi decidido que o analisador léxico faria mais do que apenas identificar o texto de um número. Para otimizar o trabalho do analisador sintático, o lexer já converte o texto (yytext) para seu valor numérico (int ou float) e o armazena, junto com seu tipo, em uma struct Numero. Essa estrutura é então passada para o parser através do campo yylval.numero. Esta abordagem centraliza a lógica de conversão e simplifica as regras sintáticas.

Ambiguidade entre Strings Multilinha e Comentários Uma característica da linguagem Python é que uma string literal que não é atribuída a uma variável pode funcionar como um comentário de bloco. O desafio era decidir como tratar isso.

A decisão tomada foi: o analisador léxico sempre tratará sequências entre aspas triplas como STRING_LITERAL. Ele não tem contexto para saber se a string será usada ou não. O lexer se encarrega de normalizar a string (removendo as aspas triplas) e a envia para o analisador sintático.

Caberá ao analisador sintático, com base em suas regras gramaticais, decidir o que fazer com esse STRING_LITERAL: se ele fará parte de uma atribuição, de um print, ou se deve ser ignorado (funcionando, na prática, como um comentário).

Desafios Encontrados

Os principais desafios encontrados foram:

Entender as estruturas básicas de um compilador e como o analisador léxico e sintático se comunicam.

Lidar com a ambiguidade de strings multilinha, que podem ser tanto valores de dados quanto comentários de bloco, dependendo do contexto sintático.

Definir uma forma eficiente de passar dados ricos (como um número já convertido e tipado) do léxico para o sintático, em vez de apenas texto.

Soluções Adotadas

Para a comunicação entre as ferramentas, foram estudados exemplos e utilizada a estrutura de tokens padrão, onde o lexer.l retorna identificadores de token que o parser.y espera.

A solução para a ambiguidade foi delegar a responsabilidade: o lexer identifica STRING_LITERAL de forma agnóstica, e o parser decide seu destino.

Para passar dados ricos, a solução foi utilizar a diretiva %union no parser.y. Isso permitiu definir um tipo yylval capaz de armazenar diferentes tipos de valores, incluindo a struct Numero para literais numéricos e ponteiros de char* para strings, tornando a gramática mais limpa e poderosa.

Histórico de Versões

Data Versão Descrição Autor Revisor
13/04/2025 1.0 Adicionando Tokens literais e de comentário Mariana Letícia Arthur Suares
17/04/2025 1.1 Adicionando explicação das decisões técnicas Arthur Suares Mariana Letícia
20/04/2025 1.2 Adicionando desafios e soluções encontrados Arthur Suares e Mariana Letícia Mariana Letícia
27/06/2025 1.3 Atualizando documentação para refletir o atual estado do código Brunna Louise -