Pug.Compiler
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
Install / Use
/learn @angelobelchior/Pug.CompilerREADME
Pug.Compiler
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:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-7-4nc4
Link para a Branch:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte7
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:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-6-2ccm
Link para a Branch:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte6
Funcionalidades:
- Suporte a while
- Correção na identificação do tipo numérico (
doubleeint). 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
Parte 5
Link para o Post:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-5-2hoi
Link para a Branch:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte5
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:
https://github.com/user-attachments/assets/baaca3a3-28bf-4860-b26b-2de4de4aa65a
Parte 4
Link para o Post:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-4-304d
Link para a Branch:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte4
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

Parte 3
Link para o Post:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-3-17n0
Link para a Branch:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte3
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:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-2-2jmi
Link para a Branch:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte2
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:
- https://dev.to/angelobelchior/reinventando-a-roda-criando-um-compilador-em-csharp-parte-1-2gih
Link para o PR:
- https://github.com/angelobelchior/Pug.Compiler/tree/parte1
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
Related Skills
node-connect
354.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
112.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
354.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
354.5kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
