Compilador académico para um subconjunto da linguagem C89, implementado em Java. O projeto demonstra as fases fundamentais de um compilador: análise léxica, análise sintática, construção de árvore sintática abstrata (AST), tabela de símbolos e análise semântica.
- Análise léxica — reconhecimento de identificadores, 29 palavras reservadas, literais (inteiro, float, char, string), operadores, delimitadores, comentários e diretivas de pré-processador.
- Análise sintática — parser recursive descent com níveis de precedência, tratamento de dangling-else e modo pânico.
- AST — hierarquia de 32 classes de nós com metadados de origem (linha e coluna) e impressão em formato de árvore.
- Tabela de símbolos — escopos, alocação de endereço simbólico e busca hierárquica.
- Análise semântica — verificação de declarações, tipos, atribuições, chamadas de função e retornos.
- JDK 24+ (o projeto usa switch expressions e instanceof patterns).
- Apache NetBeans 25 (opcional, apenas para abrir o projeto).
Abra o projeto e execute com o botão Run.
javac -encoding UTF-8 -d build/classes src/main/Main.java src/enums/TokenType.java src/utils/FileLoader.java src/entities/*.java src/entities/ast/*.java
java -cp build/classes main.Main programa.txtO caminho do ficheiro de entrada pode ser passado como argumento. Se for omitido, é usado programa.txt:
java -cp build/classes main.Main exemplo.cO ficheiro de entrada deve terminar em .c ou .txt.
programa.txt:
int x;
float y = 3;
int soma(int a, int b) {
return a + b;
}
int main (){
int i;
for (i = 0; i < 10; i++) {
if (i == 5) {
break;
}
}
return soma(x, y);
}Saída esperada: mensagem de sintaxe, impressão da AST, tabela de símbolos e resultado da análise semântica.
src/
├── main/ → ponto de entrada (Main.java)
├── enums/ → tipos de token (TokenType.java)
├── utils/ → leitura de ficheiros (FileLoader.java)
└── entities/ → Lexer, Parser, ScopeTable, SemanticAnalyzer, Symbol, Token
└── ast/ → 32 classes de nós da AST + ASTPrinter
ARCHITECTURE.md— arquitetura, decisões de projeto e limitações conhecidas.grammar.txt— gramática de referência (subconjunto de C89).CIJMC.jff— autómato finito do analisador léxico (JFLAP, 64 estados).
- Jussana Paim — nº de estudante 20230132
Distribuído sob a licença MIT. Consulte LICENSE.