oxentescript
Version:
🌴 A Linguagem de Programação dos Baianos com Tokens Coloquiais Brasileiros + Syntax Highlighting Colorido!
187 lines (152 loc) • 6.29 kB
JavaScript
import { Command } from 'commander';
import chalk from 'chalk';
import { transpiler } from './transpiler.js';
import fs from 'fs';
import path from 'path';
const program = new Command();
// ASCII Art baiano
const logo = `
🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴
____ __ _____ _ __
/ __ \\__ _____ ____/ /____ / ___/__________(_)___ / /_
/ / / / / / / _ \\/ __ / / _ \\ \\__ \\/ ___/ ___/ / __ \\/ __/
/ /_/ / /_/ / __/ / / / __/___/ / /__/ / / / /_/ / /
\\____/\\__,_/\\___/_/ /_/\\___//____/\\___/_/ /_/ .___/_/
/_/
🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴🌴
`;
console.log(chalk.yellow(logo));
console.log(chalk.green(' A Linguagem de Programação dos Baianos!'));
console.log(chalk.cyan(' Oxente, que massa! 🌴\n'));
program
.name('oxente')
.description('🌴 OxenteScript - Linguagem de programação com dialetos baianos')
.version('1.0.0');
// Comando para executar arquivo OxenteScript
program
.command('run <arquivo>')
.description('Executa um arquivo OxenteScript (.oxe)')
.action(async (arquivo) => {
try {
if (!arquivo.endsWith('.oxe')) {
console.log(chalk.red('❌ Ôxe, o arquivo precisa ter extensão .oxe!'));
process.exit(1);
}
if (!fs.existsSync(arquivo)) {
console.log(chalk.red(`❌ Arquivo não encontrado: ${arquivo}`));
process.exit(1);
}
console.log(chalk.cyan(`🌴 Executando: ${arquivo}`));
await transpiler.runFile(arquivo);
} catch (error) {
console.error(chalk.red('❌ Erro na execução:'), error.message);
process.exit(1);
}
});
// Comando para transpilar arquivo
program
.command('build <arquivo> [saida]')
.description('Transpila arquivo OxenteScript para JavaScript')
.action((arquivo, saida) => {
try {
if (!arquivo.endsWith('.oxe')) {
console.log(chalk.red('❌ Ôxe, o arquivo precisa ter extensão .oxe!'));
process.exit(1);
}
if (!fs.existsSync(arquivo)) {
console.log(chalk.red(`❌ Arquivo não encontrado: ${arquivo}`));
process.exit(1);
}
console.log(chalk.cyan(`🔧 Transpilando: ${arquivo}`));
const outputFile = transpiler.transpileFile(arquivo, saida);
console.log(chalk.green(`✅ Sucesso! Arquivo gerado: ${outputFile}`));
} catch (error) {
console.error(chalk.red('❌ Erro na transpilação:'), error.message);
process.exit(1);
}
});
// Comando para criar novo projeto
program
.command('novo <nome>')
.description('Cria um novo projeto OxenteScript')
.action((nome) => {
try {
const projectDir = path.resolve(nome);
if (fs.existsSync(projectDir)) {
console.log(chalk.red(`❌ Diretório ${nome} já existe!`));
process.exit(1);
}
// Criar estrutura do projeto
fs.mkdirSync(projectDir, { recursive: true });
// Criar arquivo principal
const mainFile = path.join(projectDir, 'main.oxe');
const mainContent = `# 🌴 Meu primeiro programa em OxenteScript
falaai("Oxente, que massa! Meu primeiro programa baiano!");
acao cumprimentar(nome) {
falaai("E aí, " + nome + "! Como tá a coisa?");
laele "chegou aqui massa!";
}
bora meuNome = "Baiano";
cumprimentar(meuNome);
# Testando a expressão "lá ele"
laele;
laele "que programa massa!";
# Vamos fazer uma contagem regressiva massa!
porfavor bora i = 10; i maiorzin 0; i-- {
falaai("Contando:", i);
}
falaai("🌴 Acabou! Oxente, que programa massa!");
`;
fs.writeFileSync(mainFile, mainContent);
// Criar package.json do projeto
const packageJson = {
name: nome,
version: "1.0.0",
description: "Projeto OxenteScript massa!",
main: "main.oxe",
scripts: {
start: "oxente run main.oxe"
}
};
fs.writeFileSync(
path.join(projectDir, 'package.json'),
JSON.stringify(packageJson, null, 2)
);
console.log(chalk.green(`✅ Projeto ${nome} criado com sucesso!`));
console.log(chalk.cyan(`📁 Entre no diretório: cd ${nome}`));
console.log(chalk.cyan(`🚀 Execute o programa: oxente run main.oxe`));
} catch (error) {
console.error(chalk.red('❌ Erro ao criar projeto:'), error.message);
process.exit(1);
}
});
// Comando para mostrar sintaxe
program
.command('sintaxe')
.description('Mostra exemplos da sintaxe OxenteScript')
.action(() => {
console.log(chalk.yellow('🌴 Sintaxe OxenteScript:\n'));
console.log(chalk.cyan('Variáveis:'));
console.log(' bora nome = "João"; # let nome = "João";');
console.log(' massa idade = 25; # const idade = 25;\n');
console.log(chalk.cyan('Condicionais:'));
console.log(' sefizer idade >= 18 { # if (idade >= 18) {');
console.log(' falaai("Maior de idade"); # console.log("Maior de idade");');
console.log(' } # }\n');
console.log(chalk.cyan('Funções:'));
console.log(' acao somar(a, b) { # function somar(a, b) {');
console.log(' devolve a + b; # return a + b;');
console.log(' } # }\n');
console.log(chalk.cyan('Loops:'));
console.log(' porfavor i = 0; i < 10; i++ { # for (let i = 0; i < 10; i++) {');
console.log(' falaai(i); # console.log(i);');
console.log(' } # }\n');
console.log(chalk.cyan('Expressões Baianas Especiais:'));
console.log(' falaai("Oi mundo!"); # console.log("Oi mundo!");');
console.log(' laele; # console.log("Lá ele! 🌴");');
console.log(' laele "que massa!"; # console.log("Lá ele!", "que massa!");\n');
console.log(chalk.green('Oxente, que massa! Use "oxente novo meu-projeto" para começar! 🌴'));
console.log(chalk.yellow('Lá ele, agora com mais expressões baianas! 🌴'));
});
program.parse();