Loading repository data…
Loading repository data…
saunderz / repository
Base do interpretador Lox (Java): análise léxica conforme Crafting Interpreters, com estrutura mínima e testes.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
Interpretador da linguagem Lox implementado em Java, seguindo o livro Crafting Interpreters (Robert Nystrom).
Este repositório reúne as entregas das unidades de Compiladores:
(){}.,-+;/*.!=, ==, <=, >=.true, false) e nil.// e espaços em branco.Arquivos principais:
Lox.java — entrypoint do interpretador, shell (arquivo e REPL) + tratamento de erros léxicos/sintáticos.Scanner.java — analisador léxico.Token.java — representação de token.TokenType.java — enumeração dos tipos de token.Extensão do interpretador para:
AST (Árvore de Sintaxe Abstrata):
Expr.java — expressões:
Stmt.java — declarações:
print, var, block ({ ... }), if/else, expressão.Parser recursivo descendente (Parser.java):
var e print.{ ... } com múltiplas declarações.if / else.= com verificação de alvo válido.Ambiente de execução (Environment.java):
Interpreter (Interpreter.java):
print (saída padrão),var (declaração e inicialização),block (novo escopo léxico),if / else (controle de fluxo),fun, chamada, retorno),class, this, init).RuntimeError.java.Funções e chamadas (fun / return):
fun add(a, b) {
return a + b;
}
print add(2, 3); // 5
return.Resolução de variáveis e escopo léxico:
Resolver.java faz uma passagem estática para determinar em qual escopo cada variável é resolvida.Interpreter usa um mapa de profundidades (locals) em conjunto com Environment.getAt() e assignAt() para buscar/atribuir variáveis no escopo correto.Funções como objetos chamáveis:
LoxCallable.java define a interface para qualquer coisa invocável em Lox (call() e arity()).LoxFunction.java implementa LoxCallable para representar funções definidas pelo usuário, incluindo:
Environment closure),return via exceção interna Return,isInitializer).Classes, instâncias e métodos (cap. 12):
class Person {
init(name) {
this.name = name;
}
sayName() {
print this.name;
}
}
LoxClass.java representa classes em tempo de execução e implementa LoxCallable:
Person("Jane")) cria uma nova instância (LoxInstance).init, ele é chamado como inicializador.LoxInstance.java representa instâncias, com:
fields) para propriedades dinâmicas,klass.findMethod(...) e ligação de this (bind).P2-Compiladores-Analise-Lexica/
├─ README.md
├─ .gitignore
├─ LICENSE
├─ examples/
│ ├─ 01_print_var.lox
│ ├─ 02_blocks.lox
│ ├─ 03_if.lox
│ └─ 04_assign.lox
└─ src/
└─ main/
└─ java/
└─ lox/
├─ Lox.java
├─ Scanner.java
├─ Token.java
├─ TokenType.java
├─ Expr.java
├─ Stmt.java
├─ Parser.java
├─ Interpreter.java
├─ Environment.java
├─ RuntimeError.java
├─ LoxCallable.java
├─ LoxFunction.java
├─ Resolver.java
├─ Return.java
├─ LoxClass.java
└─ LoxInstance.java
Obs.: a estrutura pode conter branches específicos (por exemplo,
develop,feature/expression-interpreter,feature/statements-and-control-flow) de acordo com o fluxo Git adotado na disciplina.
PATH.Verifique:
java -version
javac -version
No diretório raiz do projeto:
# Gera lista de arquivos Java (PowerShell não expande *.java diretamente no javac)
$files = Get-ChildItem -Path src\main\java\lox -Filter *.java | ForEach-Object FullName
$files | Set-Content sources.txt
mkdir out -Force
javac -d out @sources.txt
java -cp out lox.Lox
Exemplos para testar diretamente no prompt:
// Variável + print
var msg = "hello lox";
print msg;
// Blocos e escopo
var a = "global";
{
var a = 123;
print a; // 123
}
print a; // global
// If/else
if (true) print "ok"; else print "no";
// Atribuição
var x = 10;
x = x + 5;
print x; // 15
.loxjava -cp out lox.Lox examples/01_print_var.lox
java -cp out lox.Lox examples/02_blocks.lox
java -cp out lox.Lox examples/03_if.lox
java -cp out lox.Lox examples/04_assign.lox
Exemplos adicionais envolvendo funções e classes (pode criar na pasta examples/):
// 05_functions.lox
fun greet(name) {
print "Hello, " + name + "!";
}
greet("Lox");
fun makeCounter() {
var count = 0;
fun inc() {
count = count + 1;
print count;
}
return inc;
}
var c = makeCounter();
c(); // 1
c(); // 2
// 06_classes.lox
class Person {
init(name) {
this.name = name;
}
sayName() {
print this.name;
}
}
var jane = Person("Jane");
jane.sayName(); // Jane
Este projeto é distribuído sob a licença MIT.
obj.field,obj.field = valor,obj.method(args),this dentro de métodos para acessar o objeto atual.