Skip to content

angelobelchior/Pug.Compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pug.Compiler

.NET

Esse repositório faz parte da série Criando um compilador em csharp na qual vamos construir um compilador do zero em csharp.

Essa construção será dividida em partes e cada parte terá um post e uma branch específica.

Cada post vai conter a explicação e implementação de uma ou mais funcionalidades do compilador e sempre estará associado a uma branch (parte1, parte2, etc.).

A branch main sempre estará com o código referente ao post mais recente. Nesse caso estamos na parte 7.


Parte 7

Link para o Post:

Link para a Branch:

Funcionalidades:

  • Suporte ao comando for
for int i = 0 to 10 step 2
    print(i)
end

> 0
> 2
> 4
> 6
> 8
> 10

Parte 6

Link para o Post:

Link para a Branch:

Funcionalidades:

  • Suporte a while
  • Correção na identificação do tipo numérico (double e int). Antes todo resultado de expressão era considerado double, agora o tipo é identificado corretamente.
  • Melhoria e inclusão de testes unitários
  • Inclusão de vários exemplos de código (verificar números primos e palíndromos, converter decimal para binário, inverter string, Célsius para Fahrenheit, etc.) além de dar um tapinha na nossa “IDE”.
int n = 10          
int result = 1     
int i = 1          
while i <= n
    result = result * i
    i = i + 1
end
print("Fatorial de " + n + " = " + result)

> Fatorial de 10 = 3628800

//--

if 4 % 2 == 0
    print("É par")
else
    print("É ímpar")
end

> É par

//--

int numero = 1984
string binario = ""
while numero > 0
    int resto = numero % 2
    binario = resto + binario
    numero = to_int(numero / 2)
end
print("Binário = " + binario)

> Binário = 11111000000

Parte 5

Link para o Post:

Link para a Branch:

Funcionalidades:

  • Suporte a if/then/else
  • Inclusão do operador % para obter o resto da divisão
  • Inclusão das funções internas:
    • Comparativas:
      • iif,
    • Matemáticas:
      • log, exp, sin, cos, tan, atn, abs, sgn
    • Strings
      • left, right, mid, trim, trim_end, trim_start
    • Conversoras:
      • to_string, to_bool, to_int, to_double
  • Melhoria no Pug Editor
    • Ajustes no Layout
    • Inclusão de um combo com samples de código
    • Ao clicar em um token (no painel a esquerda) é possível visualizar no editor o código-fonte que gerou aquele token
    • Caso ocorra algum erro de compilação, o editor irá destacar a linha do erro

Nessa branch foi ajustado o código para que nomes de variáveis permitirem _ e números no meio da palavra: Exemplo: int idade_1 = 41

int idade = 18
string nome = "Angelo"
if idade >= 18
    print("acesso permitido")
else
    if nome == "Angelo"
        print("acesso em avaliação")
    else
        print("acesso negado")
    end
end
print("Fim do programa")

> acesso permitido
> Fim do programa

//--

if 4 % 2 == 0
    print("É par")
else
    print("É ímpar")
end

> É par

//--

int idade = 15
string mensagem = iif(idade >= 18, "Acesso Liberado", "Acesso Negado")
print(mensagem)

Pug.Compiler IDE:

Pug.Compile.-.Part5.mov

Parte 4

Link para o Post:

Link para a Branch:

Funcionalidades:

  • Suporte a operadores lógicos e condicionais
  • Pug.Editor um editor de código para a linguagem Pug

Nessa branch adicionamos o suporte a operadores lógicos e condicionais, além de um editor de código configurado para suportar a linguagem Pug.

> bool valor = 2 == 2 || 3 == 4
True
> bool valor = 1 == 2 && 3 == 4
False
> bool valor = (5 > 1) && (10 > 2)
True
> bool valor = (5 < 1) || (10 < 2)
False
> (2 < 3) && (4 > 1)
True
> (3 == 3) || (6 != 6)
True
> 7 <= 7
True
> 3 <= 2
False

Pug.Editor


Parte 3

Link para o Post:

Link para a Branch:

Funcionalidades:

  • Adicionando suporte a declaração de variáveis

Nessa branch adicionamos o suporte a declaração de variáveis e atribuição de valores a elas:

> int idade = 41
41
> string nome = "Angelo"
Angelo
> print(nome + " tem " + idade + " de idade")
Angelo tem 41 de idade
> double pi = 3.14
3.14
> "A" * 3
AAA
> 3 * "A"
AAA
> "Angelo Belchior" - " Belchior"
Angelo

Parte 2

Link para o Post:

Link para a Branch:

Funcionalidades:

  • Adicionando métodos internos à nossa linguagem

Nessa branch adicionamos o suporte a funções internas da nossa linguagem como pow, sqrt, min, max, round e random. E como podemos ver nos exemplos abaixo, é possível passar expressões matemáticas como parâmetros:

> pow(2)
4
> pow(2, 3)
8
> sqrt(20 + 5)
5
> min(7, sqrt(25) + 1)
6
> max(10, 11)
11
> round(12.35)
12
> round(12.35, 1)
12.4
> random()
18
> random(1, 10)
4
> random(5)
3
> int valor = random(pow(2), sqrt(81))
6

Parte 1

Link para o Post:

Link para o PR:

Funcionalidades:

  • Interpretação de Expressões Numéricas

Nessa branch temos o motor de interpretação de expressões numéricas que respeitam a ordem dos parênteses e a prioridade das operações de multiplicação e divisão:

Podemos executar as seguintes expressões:

> 1 + 2
3

> 1 + (2 * 3)
7

> (2 * (3 * 4) / 5) + 6
10,8

About

Compilador da linguagem Pug. O processo de criação do compilador pode ser lido na série chamada "Criando um Compilador" em https://dev.to/angelobelchior/series/31549

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published