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.
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
Link para o Post:
Link para a Branch:
Funcionalidades:
- Suporte a while
- Correção na identificação do tipo numérico (
double
eint
). Antes todo resultado de expressão era consideradodouble
, 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
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
- Comparativas:
- 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
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
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
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
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