Este projeto foi desenvolvido durante a disciplina de Compiladores, no curso de Ciência da Computação da UFSCar - Sorocaba. Foram implementadas as etapas de análise sintática, léxica e semântica da compilação de uma linguagem de programação fictícia chamada K para a linguagem C. Todo o código-fonte do projeto foi escrito em Java.
Diante do fato deste projeto ter sido feito em uma disciplina ofertada em ambiente acadêmico, não é possível fornecer detalhes específicos da linguagem de programação utilizada como código de entrada do compilador. Esta linguagem é ficcional, criada para fins didáticos, baseando-se em linguagens comumente tipadas estaticamente e de paradigma estrutural.
No entanto, aqui há uma lista de recursos comuns a outras linguagens de programação e que são suportados por esta linguagem:
- Comandos condicionais (
if ... then,else,endif) - Comandos de repetição (
while ... endw) - Declaração e atribuição de variáveis
- Tipagem estática de funções, variáveis e parâmetros (
int,stringeboolean) - Operadores matemáticos e lógicos básicos (
+,-,==,<=,||,&&, etc) - Declaração e chamada de funções (com e sem parâmetros e/ou retorno)
- Comentários de uma linha e multibloco (
//e/* ... */) - Necessidade de declaração de função principal sem parâmetros (
def main) - Existência de funções pré-definidas de entrada/saída de dados
- Entre outros
Alguns exemplos de códigos escritos em K se encontram em examples/inputs, neste repositório.
A execução do compilador utiliza dois arquivos: um de entrada, com o código-fonte em K a ser compilado, e um de saída, com o código-fonte em C ou as mensagens de erro de compilação. Caso o arquivo de saída esteja em falta, o próprio programa o criará.
Para passar os arquivos para o programa, basta utilizar os argumentos de execução padrão do Java (String [] Args) na ordem anteriormente citada.
Durante a compilação, o programa buscará e salvará quaisquer tipos de erros sintáticos, léxicos ou semânticos, baseando-se na gramática original da linguagem K. Estes erros serão, então, escritos no arquivo de saída do programa. Caso nenhum erro tenha sido encontrado, o programa gerará o código-fonte em C correspondente ao código-fonte original.
- Código com erros sintáticos
Arquivo de entrada:
def main{
Saída do compilador:
teste.in:2: statement inválido
def main{
teste.in:2: } esperado
def main{
- Código com erros sintáticos (corrigido)
Arquivo de entrada:
def main{}
Saída do compilador
#include <stdio.h>
void main(){
}
Mais exemplos podem ser encontrados na pasta examples deste repositório.