Skip to content

RobertoDebarba/rd-compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RD Compiler

Build Status

A simple compiler for my own language writen on Java and Gals generated code. It generates MSIL code for Microsoft .Net.

Um compilador simples para minha própria linguagem escrito em Java e código gerado pelo Gals. Ele gera código em MSIL para .Net da Microsoft.

main

Sample programs

Hello world

algoritmo "Hello world" início escreva ("Hello world!"); fim 

Average calculator with functions

algoritmo "Average calculator" função média (n1, n2: real): real; procedimento cargaHorária (); variáveis	i: inteiro;	nota1, nota2, soma: real; início	i <- 0;	soma <- 0.0;	repita	i <- i + 1;	cargaHorária ();	escreva ("digite uma nota (enter) após outra: ",	quebra);	leia (nota1, nota2);	soma <- soma +	média (nota1 , nota2 ) ;	até i = 3;	escreva (soma / 3); fim função média ; início	retorne (n1 + n2) / 2; fim procedimento cargaHorária ; variáveis	CH: inteiro;	disciplina: caracter; início	escreva ("qual a disciplina? ");	leia (disciplina);	repita	escreva ("qual a CH da disciplina? ");	leia (CH);	até CH > 17;	escreva ("total de créditos: ", CH / 18, quebra); fim 

You can check all samples on folder samples.

How to build

Prerequisites

  • JDK 8
  • Maven

Build and package

  1. mvn package

Test

  1. mvn test

How to run programs

Prerequisites

Build and run code

  1. generate code
  2. compile with ilasm ilasm <program-name>.il
  3. run on cmd program-name.exe

If you want to run on Linux, you can use Mono:

  1. $ apt install mono-devel
  2. generate code
  3. compile with mono ilasm $ ilasm <program-name>.il
  4. run on shell mono program-name.exe

Language specification

Regular definitions

acentuada: [áÁâÂãÃàÀéÉêÊíÍîÎóÓôÔõÕúÚûÛçÇ] letra: [a-z A-Z] digito: [0-9] simbolo: [^\\\n\"] 

Tokens

identificador: ({letra}|{acentuada})(_)?((({letra}|{digito}|{acentuada})+_)*|({letra}|{acentuada}|{digito}))* constante_inteira: 0|[1-9][0-9]* constante_real: (0|[1-9][0-9]*)\.[0-9]+ constante_caracter: \"({simbolo}|\\\"|\\\\)*\" 

Keywords

algoritmo até caracter e então escreva falso fim função início inteiro interrompa leia lógico não ou procedimento quebra real repita retorne se senão variáveis verdadeiro 

Special Characters

+ - * / , : ; <- = <> < <= > >= ( ) 

Grammar

<programa>::= algoritmo constante_caracter <cabecalho_modulos> <variaveis_opcional> início <lista_comandos> fim <lista_modulos>; <cabecalho_modulos>::=<cabecalho><cabecalho_modulos>|î; <variaveis_opcional>::=<variaveis>|î; <lista_comandos>::=<comando>";"<lista_comandos>|î; <comando>::=identificador <comando_1>|<entrada_dados>|<saida_dados>|<selecao>|<repeticao>|<interrompa>|<retorne>; <comando_1>::="<-" <expressao> |"(" <parametros_reais> ")"; <lista_modulos>::=<modulo><lista_modulos>|î; <modulo>::=<funcao>|<procedimento>; <cabecalho>::=<funcao_cabecalho>|<procedimento_cabecalho>; <funcao_cabecalho>::=funcao identificador "(" <lista_parametros> ")" ":" <tipo> ";"; <procedimento_cabecalho>::=procedimento identificador "(" <lista_parametros> ")" ";"; <lista_parametros>::=<parametro><lista_parametros_adicionais>|î; <lista_parametros_adicionais>::=";" <parametro><lista_parametros_adicionais>|î; <parametro>::=<lista_identificadores> ":" <tipo> ; <lista_identificadores>::=identificador <lista_identificadores_adicionais>; <lista_identificadores_adicionais>::="," identificador <lista_identificadores_adicionais>|î; <tipo>::=caracter|logico|inteiro|real; <variaveis>::=variaveis <lista_variaveis>; <lista_variaveis>::=<variavel><lista_variaveis_1>; <lista_variaveis_1>::=î|<lista_variaveis>; <variavel>::=<lista_identificadores> ":" <tipo> ";"; <entrada_dados>::=leia "(" <lista_identificadores> ")"; <saida_dados>::=escreva "(" <lista_valores> ")"; <lista_valores>::=<valor> <lista_valores_adicionais>; <lista_valores_adicionais>::="," <valor> <lista_valores_adicionais>|î; <valor>::=<expressao>|quebra; <selecao>::=se <expressao> entao <lista_comandos> <senao_opcional> fim; <senao_opcional>::=senao <lista_comandos>|î; <repeticao>::=repita <lista_comandos> ate <expressao>; <interrompa>::=interrompa; <retorne>::=retorne <expressao>; <parametros_reais>::=<lista_expressoes>|î; <lista_expressoes>::=<expressao><lista_expressoes_adicionais>; <lista_expressoes_adicionais>::="," <expressao><lista_expressoes_adicionais>|î; <funcao>::=funcao identificador ";" <variaveis_opcional> início <lista_comandos> fim; <procedimento>::=procedimento identificador ";" <variaveis_opcional> início <lista_comandos> fim; <expressao> ::= <elemento><expressao_1>; <expressao_1> ::= î|e <elemento> <expressao_1>|ou <elemento> <expressao_1>; <elemento> ::= <relacional> | verdadeiro | falso | nao <elemento>; <relacional> ::=<aritmetica><relacional_1>; <relacional_1>::=<operador_relacional> <aritmetica> |î; <operador_relacional> ::= "=" | "<>" | "<" | "<=" | ">" | ">="; <aritmetica> ::= <termo><aritmetica_1>; <aritmetica_1> ::=î| "+" <termo> <aritmetica_1>|"-" <termo> <aritmetica_1>; <termo> ::=<fator><termo_1>; <termo_1>::=î|"*" <fator> <termo_1>|"/" <fator> <termo_1>; <fator> ::= identificador <fator_1> | constante_inteira | constante_real | constante_caracter | "(" <expressao> ")" | "+" <fator> | "-" <fator>; <fator_1>::= î|"(" <parametros_reais> ")"; 

You can check all specification on file gramatica.gals.

Authors

Contributors

License

The codebase is licensed under GPL v3.0.

About

A simple compiler for my own language writen on Java and Gals code generator

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages