Testes dos analisadores léxico e sintático¶
Os testes automatizados ficam em tests/test_parser.sh (suíte principal) e tests/teste_parser_extra.sh (suíte ampliada). Como rodar: ver Como usar.
Objetivo¶
Foram realizados testes dos analisadores léxico e sintático do projeto. O objetivo foi verificar se o programa reconhece os elementos da linguagem e aceita ou rejeita as estruturas conforme as regras implementadas nesta etapa.
Testes realizados¶
Na análise léxica, foram verificados identificadores, palavras reservadas, números, strings, caracteres, operadores, comentários e caracteres não reconhecidos. Também foram observadas as mensagens de erro e a indicação da linha em que o erro ocorre.
Na análise sintática, foram testadas declarações de variáveis, atribuições, expressões aritméticas e comparações, uso de parênteses, múltiplos declaradores, incremento e decremento e blocos delimitados por chaves. Para cada grupo de construções, foram usadas entradas válidas e inválidas.
Resultados¶
O projeto foi compilado sem erros. Os sete testes automatizados que já faziam parte do repositório passaram, assim como vinte testes adicionais. Nos testes manuais realizados, os casos válidos foram aceitos e os inválidos foram rejeitados conforme o esperado.
Exemplos de entradas e saídas¶
| Entrada | Resultado esperado | Saída observada |
|---|---|---|
int _nome2 = 7; |
Aceitar | Analise sintatica concluida com sucesso. |
int nome$ = 7; |
Rejeitar | Erro léxico no $, seguido de erro sintático |
float x = 12.5; |
Aceitar | Analise sintatica concluida com sucesso. |
float x = 12.5.3; |
Rejeitar | Erro léxico no segundo ., seguido de erro sintático |
int x = 8; // comentario |
Aceitar | Analise sintatica concluida com sucesso. |
int x = 8 /* comentario */ / 2; |
Aceitar | Analise sintatica concluida com sucesso. |
int x = (2 + 3 * 4; |
Rejeitar | Erro sintático: unexpected PONTOVIR |
{ int x = 1; x++; |
Rejeitar | Erro sintático: unexpected end of file |
int x = 1; } |
Rejeitar | Erro sintático: unexpected RCHAVE |
int x = 8 /* comentario sem fim; |
Rejeitar | Erro sintático: unexpected TIMES |
Ponto de melhoria¶
Foi identificado um ponto de melhoria no tratamento de comentários de bloco sem fechamento. A entrada é rejeitada, mas o programa apresenta um erro sintático relacionado ao símbolo de multiplicação, em vez de informar que o comentário não foi encerrado. A rejeição está correta; a mensagem não descreve claramente a causa do problema.
Limites dos testes¶
Os testes desta versão verificam principalmente o reconhecimento léxico e a aceitação ou rejeição da sintaxe. O programa ainda não apresenta a sequência de tokens para inspeção individual nem executa as instruções analisadas.
Quando forem implementadas a análise semântica e a execução do interpretador, serão necessários testes para declaração e uso de variáveis, compatibilidade de tipos e resultados calculados. Assim, os resultados atuais não devem ser entendidos como validação do interpretador completo.
Atualização após as novas regras sintáticas¶
Após a inclusão de if/else, definições de funções e return, a suíte adicional foi atualizada. O teste que antes esperava a rejeição de if passou a esperar sua aceitação, e foram acrescentados dez casos. Na versão atual, a suíte principal passou (7/7) e a adicional passou (30/30).
Os novos casos verificam if simples, if-else, if aninhado, funções com parâmetros tipados, sem parâmetros e com (void), e return. Também verificam a rejeição de if sem condição, else isolado, parâmetro sem tipo, vírgula final nos parâmetros e return sem ponto e vírgula.
| Entrada | Resultado esperado | Saída observada |
|---|---|---|
if (1) { int x = 2; } |
Aceitar | Analise sintatica concluida com sucesso. |
if () { int x = 1; } |
Rejeitar | Erro sintático: unexpected RPAREN |
int soma(int a, int b) { return a + b; } |
Aceitar | Analise sintatica concluida com sucesso. |
int soma(int a,) { return a; } |
Rejeitar | Erro sintático: unexpected RPAREN |