Como citei anteriormente, eu iria iniciar o projeto de um novo compilador, open source, em Go. Basicamente, o POJ (Pascal on the JVM) possibilita que seja executado um subset de Pascal na JVM. Mais detalhes sobre o projeto nesta postagem aqui.
A primeira meta do projeto era conseguir compilar e executar o "Hello world" em Pascal na JVM. Apesar de parecer simples, envolvia uma série de tarefas como:
- Definir qual gerador de parsers será utilizado: realizei alguns testes com o ANTLR e, apesar de alguns "perrengues" no início, optei por ele;
- Encontrar uma gramática de Pascal pronta no formato do ANTLR: isso foi bem tranquilo, já que no repositório do ANTLR existe a gramática pronta para várias linguagens;
- Ajustar a gramática para reconhecer o subset de Pascal esperado: no momento, apenas removi algumas sintaxes que realmente não serão utilizadas;
- No parser identificar a definição de procedimentos no Pascal para determinar o bloco principal: isso gerou um pouco de trabalho por falta de conhecimento minha sobre a V4 do ANTLR (usei muito a V2 e V3 anteriormente);
- Encontrar um montador Java Assembly: o mais conhecido é o Jasmin, mas não consegui rodar os exemplos simples (talvez por imperícia minha, enfim), então acabei optando pelo JASM porque rapidamente consegui executar os exemplos;
- POJ gerar um código assembly Java válido para o JASM: aqui a dificuldade foi entender como a V4 do ANTLR funciona para obter os tokens no código em Go;
- Criar o README inicial: tentei criar o mínimo necessário, mas já tem as instruções sobre como criar o binário, executar o POJ, executar o "Hello world" na JVM, entre outros.
No momento, dos exemplos citados na postagem anterior, apenas o exemplo do "Hello world" funciona no POJ. Claro que variações deste exemplo, como várias chamadas a writeln funcionam também:
program Hello;
begin
writeln ('Hello world1!');
writeln ('Hello world2!');
writeln ('Hello world3!');
end.
Para possibilitar a execução de outros programas em Pascal, nas próximas semanas vou focar em recursos como:
- Declaração e uso de variáveis;
- Entrada e saída de dados (terminal);
- Instrução If/Else, For, Repeat e While;
- Operações aritméticas;
- Declaração e uso de procedures e funções;
- Uso de funções recursivas.
Para quem se interessou, o repositório do projeto é este aqui.
Top comments (0)