Este projeto implementa um compilador completo para a linguagem X25a, incluindo:
- Analisador Léxico (Scanner) - Parte (a)
- Gramática LL(1) - Parte (b)
- Analisador Sintático (Parser) - Parte (c)
O analisador léxico utiliza um Autômato Finito Determinístico (AFD) implementado manualmente em C, e o analisador sintático utiliza a técnica descendente recursiva preditiva LL(1).
gcc -o compilador main.c lexico.c sintatico.c -WallApenas Léxico:
gcc -o analisador mainLexico.c lexico.c -WallApenas Sintático:
gcc -o sintatico mainSintatico.c sintatico.c lexico.c -WallExplicação:
gcc: compilador C-o compilador: nome do executável geradomain.c lexico.c sintatico.c: arquivos a compilar-Wall: mostra todos os warnings (avisos)
./compilador teste1.x25aIsso vai:
- Fazer análise léxica
- Salvar tokens em
teste1.x25a.Results.txt - Fazer análise sintática
- Reportar se o programa é válido ou tem erros
Apenas Léxico:
./analisador teste1.x25aApenas Sintático:
./sintatico teste1.x25a=== ANALISE LEXICA - LINGUAGEM X25a ===
Arquivo: teste1.x25a
========================================
Linha Coluna Token Lexema
------------------------------------------------
2 1 LEIA LEIA
2 6 ID num
2 9 VIRGULA ,
3 1 ID fat
3 5 ATRIB :=
...
========================================
Total de tokens: 39
Erros léxicos: 0
Deu certo
Programa válido:
Analise sintatica concluida SEM ERROS!
Programa VALIDO segundo a gramatica X25a.
LEIA,ESCREVASE,ENTAO,SENAO,FIMFACA,ENQUANTO
- Variáveis: 1 a 3 letras minúsculas (
x,num,fat)
- Inteiros:
0,1,123, etc.
- Atribuição:
:= - Aritméticos:
+,-,*,/ - Relacionais:
<,=
,(vírgula)
- Strings:
'texto entre aspas simples'
[comentário]- são ignorados
O analisador léxico detecta:
- Identificador muito longo (mais de 3 letras consecutivas que não seja palavra-chave)
- ':' sem '=' (dois pontos sozinho)
- String não fechada (falta de
'no final) - Caracteres inválidos
O analisador sintático detecta:
- Comando inválido (token inesperado)
- Palavra-chave faltando (esperado SE, ENTAO, etc.)
- Operador faltando (esperado :=, <, =, etc.)
- Estrutura incorreta (comando incompleto)