Pystache é uma linguagem de programação de alto nível desenvolvida como projeto da disciplina de Compiladores (CC6252) do Centro Universitário FEI. Foi projetada para facilitar o aprendizado de iniciantes e, ao mesmo tempo, ser conveniente para programadores de todos os níveis de experiência.
Principais Características
- Linguagem com keywords em português
- Linguagem indentada (indentação faz parte da gramática)
- Variados tipos de laços de repetição
- Tipagem implícita (realiza auto-casting)
- Controle de escopo
- Geração de código intermediário em C++
- Extensão para o VSCode, que simplifica o uso da linguagem
Primeiros Passos
Sistemas Operacionais Suportados
Pré-requisitos
- G++
- Python 3.10 ou mais recente
- Git
- VSCode (caso deseje utilizar a extensão)
Instalação
- Clone o repositório:
git clone https://github.com/gb-cs-rt/pystache_lang.git
cd pystache_lang
- Conceda permissão de execução e rode o script de instalação:
chmod +x install.sh && ./install.sh
- Crie um arquivo com a extensão
.pyst
e execute o compilador:
pystache <nome_do_arquivo.pyst>
Extensão para VSCode
- Acesse o Marketplace de extensões do VSCode e pesquise por Pystache Lang.
- Instale a extensão e abra um arquivo com a extensão
.pyst
. A extensão fornece:
- Syntax highlighting específico para a linguagem
- Atalho para compilar e rodar o código rapidamente (necessário ter a linguagem instalada)
- Tema de cor personalizado
Opções adicionais
Flags
pystache <nome_do_arquivo.pyst> -tree
- Exibe a árvore sintática do código fonte.
pystache <nome_do_arquivo.pyst> -tokens
- Exibe a lista de tokens reconhecidos no código fonte.
pystache <nome_do_arquivo.pyst> -hash
- Exibe o dicionário de tipos atribuídos às variáveis.
Exemplos e Equivalência
Declaração de variável
a: 1
b: 2.5
texto: "Olá, mundo!"
lista: [1, 2, 3]
int a = 1;
double b = 2.5;
string texto = "Olá, mundo!";
vector<int> lista = {1,2,3};
Entrada de Dados
n1: entradaNumero("Insira um número inteiro: ")
n2: entradaReal("Insira um número real: ")
n3: entrada("Insira um texto: ")
int n1 = entradaNumero("Insira um número inteiro: ");
double n2 = entradaReal("Insira um número real: ");
string n3 = userInput("Insira um texto: ");
// obs: funções pré-declaradas no código traduzido.
Saída de Dados
exiba("O valor de n3 é %s\n", n3)
printf("O valor de n3 é %s\n", n3.c_str());
Operações Aritméticas
soma: a + b
subtracao: a - b
multiplicacao: a * b
divisao: a / b
divisaoInteira: a // b
modulo: a % 2
potencia: a ^ b
double soma = a + b;
double subtracao = a - b;
double multiplicacao = a * b;
double divisao = a / (float)b;
double divisaoInteira = a / b;
int modulo = a % 2;
double potencia = pow(a, b);
Operações Relacionais
igual: a = b
diferente: a != b
maior: a > b
menor: a < b
maiorIgual: a >= b
menorIgual: a <= b
double igual = a == b;
double diferente = a != b;
double maior = a > b;
double menor = a < b;
double maiorIgual = a >= b;
double menorIgual = a <= b;
a +: 1
a -: 1
a *: 2
a /: 2
a //: 2
a %: 2
a ^: 2
a += 1;
a -= 1;
a *= 2;
a /= 2;
a = (int)a / 2;
a %= 2;
a = pow(a,2);
Estrutura de Controle se senão
se a > b entao
exiba("a é maior que b\n")
senao
exiba("b é maior que a\n")
if (a > b) {
printf("a é maior que b\n");
} else {
printf("b é maior que a\n\n");
};
Laço de repetição repita "n" vezes
repita 10 vezes
exiba("essa é a repetição número %d\n", x1)
se x1 = 5 entao
pare
for (int x1 = 0; x1 < 10; x1++) {
printf("essa é a repetição número %d\n",x1);
if (x1 == 5) {
break;
};
};
// obs: xN é a variável interna utilizada nos laços com variável implícita
Laço de repetição repita de "a" ate "b"
repita de 0 ate n1
exiba("essa é a repetição número %d\n", x1)
repita de 0 ate 10 passo 2
exiba("essa é a repetição número %d\n", x1)
for (int x1 = 0; x1 < 10; x1++) {
printf("essa é a repetição número %d\n",x1);
};
for (int x1 = 0; x1 <= 10; x1 = x1 + 2) {
printf("essa é a repetição número %d\n",x1);
};
Laço de repetição repita sendo "i" de "a" ate "b"
repita sendo i de 0 ate 10
exiba("essa é a repetição número %d\n", i)
for (int i = 0; i <= 10; i++) {
printf("essa é a repetição número %d\n",i);
};
Laço de repetição enquanto
enquanto a < n1
exiba("a é menor que 10\n")
a +: 1
se a = (n1-1) entao
exiba("fim.\n\n")
while (a < n1) {
printf("a é menor que 10\n");
a+=1;
if (a == (n1-1)) {
printf("fim.\n\n");
};
};
Declaração de função
funcao soma(a, b)
retorne a + b
resultado: soma(1, 2)
funcao ping()
exiba("pong\n")
ping()
double soma(int a, int b) {
return a + b;
};
void ping() {
printf("pong\n");
};
int main() {
double resultado = soma(1,2);
ping();
return 0;
}
// obs: funções só podem receber inteiros como argumento, e sempre retornam double.
Acesso à lista
a: lista[0]
lista[0]: 10
repita sendo i de 0 ate 2
exiba("O elemento %d da lista é %d\n", i, lista[i])
int a = lista[0];
lista[0] = 10;
for (int i = 0; i <= 2; i++) {
printf("O elemento %d da lista é %d\n", i, lista[i]);
};