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.
algoritmo "Hello world" início escreva ("Hello world!"); fim 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.
- JDK 8
- Maven
mvn package
mvn test
- generate code
- compile with ilasm
ilasm <program-name>.il - run on cmd
program-name.exe
If you want to run on Linux, you can use Mono:
$ apt install mono-devel- generate code
- compile with mono ilasm
$ ilasm <program-name>.il - run on shell
mono program-name.exe
acentuada: [áÁâÂãÃàÀéÉêÊíÍîÎóÓôÔõÕúÚûÛçÇ] letra: [a-z A-Z] digito: [0-9] simbolo: [^\\\n\"] 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}|\\\"|\\\\)*\" 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 + - * / , : ; <- = <> < <= > >= ( ) <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.
The codebase is licensed under GPL v3.0.
