<commit_before>mod error;
mod nparser;
mod eval;
mod vm;

extern crate meval;

/// Imprime mensagem de ajuda
fn print_help() {
    println!("Ta querendo ajuda, cumpade?");
    println!("O uso é o seguinte: birl [opções] [arquivo ou arquivos]");
    println!("Cê pode passar mais de um arquivo, só que apenas um pode ter a seção \"SHOW\", que \
              é");
    println!("o ponto de partida do teu programa.");
    println!("As opções são as seguintes:");
    println!("\t-a ou --ajuda-o-maluco-ta-doente       : Imprime essa mensagem de ajuda");
    println!("\t-v ou --vers[ã ou a]o-dessa-porra      : Imprime a versão do programa");
    println!("\t-t ou --tudo-cumpade                   : Imprime todos os comandos disponíveis");
    println!("\t-o ou --oloco-bixo                     : (DEBUG) Testa cada um dos exemplos pra \
              ter certeza que tá tudo funfando.");
}

/// Versão numérica
pub static BIRLSCRIPT_VERSION: &'static str = "1.1.6";

/// Imprime a mensagem de versão
fn print_version() {
    println!("Versão descendente:");
    println!("Interpretador BIRLSCRIPT v{}", BIRLSCRIPT_VERSION);
    println!("Copyright(r) 2016 <NAME> <<EMAIL>> - Licença: MIT");
}

/// Coleção de parametros passados ao interpretador
enum Param {
    /// Pedido para printar versão
    PrintVersion,
    /// Pedido para printar ajuda
    PrintHelp,
    /// Arquivo passado para interpretação
    InputFile(String),
    /// Mostra todos os comandos disponiveis
    ShowCmds,
    /// Testa todos os exemplos disponiveis
    Test,
}

/// Faz parsing dos comandos passados e retorna uma lista deles
fn get_params() -> Vec<Param> {
    use std::env;
    let mut ret: Vec<Param> = vec![];
    let mut params = env::args();
    // Se o proximo argumento é um valor que deve ser ignorado
    let mut next_is_val = false;
    if params.len() >= 2 {
        params.next(); // Se livra do primeiro argumento
        loop {
            let p = match params.next() {
                Some(v) => v,
                None => break,
            };
            if next_is_val {
                next_is_val = false;
                continue;
            }
            match p.as_str() {
                "-" | "--" => warn!("Flag vazia passada."),
                "-a" |
                "--ajuda-o-maluco-ta-doente" => ret.push(Param::PrintHelp),
                "-v" |
                "--versão-dessa-porra" |
                "--versao-dessa-porra" => ret.push(Param::PrintVersion),
                "-t" | "--tudo-cumpade" => ret.push(Param::ShowCmds),
                "-o" | "--oloco-bixo" => ret.push(Param::Test),
                _ => ret.push(Param::InputFile(p)),
            }
        }
    }
    ret
}

/// Imprime na tela todos os comandos disponíveis
fn show_cmds() {
    println!("Todos os comandos BIRL!");
    use nparser::kw::*;
    let commands = vec![MOVE, CLEAR, CMP, CMP_EQ, CMP_NEQ, CMP_LESS, CMP_LESSEQ, CMP_MORE,
                        CMP_MOREEQ, DECL, DECLWV, JUMP, PRINT, PRINTLN, QUIT, INPUT, INPUT,
                        INPUT_UP];
    for cmd in &commands {
        println!("{}", cmd);
    }
}

/// Faz testes nos programas localizados em testes/
fn test_programs() {
    use std::{fs, thread, process};
    use vm::VM;
    let files =<commit_msg>Remove necessidade do módulo de erros e avisos<commit_after>mod nparser;
mod eval;
mod vm;

extern crate meval;

/// Imprime mensagem de ajuda
fn print_help() {
    println!("Ta querendo ajuda, cumpade?");
    println!("O uso é o seguinte: birl [opções] [arquivo ou arquivos]");
    println!("Cê pode passar mais de um arquivo, só que apenas um pode ter a seção \"SHOW\", que \
              é");
    println!("o ponto de partida do teu programa.");
    println!("As opções são as seguintes:");
    println!("\t-a ou --ajuda-o-maluco-ta-doente       : Imprime essa mensagem de ajuda");
    println!("\t-v ou --vers[ã ou a]o-dessa-porra      : Imprime a versão do programa");
    println!("\t-t ou --tudo-cumpade                   : Imprime todos os comandos disponíveis");
    println!("\t-o ou --oloco-bixo                     : (DEBUG) Testa cada um dos exemplos pra \
              ter certeza que tá tudo funfando.");
}

/// Versão numérica
pub static BIRLSCRIPT_VERSION: &'static str = "1.1.6";

/// Imprime a mensagem de versão
fn print_version() {
    println!("Versão descendente:");
    println!("Interpretador BIRLSCRIPT v{}", BIRLSCRIPT_VERSION);
    println!("Copyright(r) 2016 <NAME> <<EMAIL>> - Licença: MIT");
}

/// Coleção de parametros passados ao interpretador
enum Param {
    /// Pedido para printar versão
    PrintVersion,
    /// Pedido para printar ajuda
    PrintHelp,
    /// Arquivo passado para interpretação
    InputFile(String),
    /// Mostra todos os comandos disponiveis
    ShowCmds,
    /// Testa todos os exemplos disponiveis
    Test,
}

/// Faz parsing dos comandos passados e retorna uma lista deles
fn get_params() -> Vec<Param> {
    use std::env;
    let mut ret: Vec<Param> = vec![];
    let mut params = env::args();
    // Se o proximo argumento é um valor que deve ser ignorado
    let mut next_is_val = false;
    if params.len() >= 2 {
        params.next(); // Se livra do primeiro argumento
        loop {
            let p = match params.next() {
                Some(v) => v,
                None => break,
            };
            if next_is_val {
                next_is_val = false;
                continue;
            }
            match p.as_str() {
                "-" | "--" => {}
                "-a" |
                "--ajuda-o-maluco-ta-doente" => ret.push(Param::PrintHelp),
                "-v" |
                "--versão-dessa-porra" |
                "--versao-dessa-porra" => ret.push(Param::PrintVersion),
                "-t" | "--tudo-cumpade" => ret.push(Param::ShowCmds),
                "-o" | "--oloco-bixo" => ret.push(Param::Test),
                _ => ret.push(Param::InputFile(p)),
            }
        }
    }
    ret
}

/// Imprime na tela todos os comandos disponíveis
fn show_cmds() {
    println!("Todos os comandos BIRL!");
    use nparser::kw::*;
    let commands = vec![MOVE, CLEAR, CMP, CMP_EQ, CMP_NEQ, CMP_LESS, CMP_LESSEQ, CMP_MORE,
                        CMP_MOREEQ, DECL, DECLWV, JUMP, PRINT, PRINTLN, QUIT, INPUT, INPUT,
                        INPUT_UP];
    for cmd in &commands {
        println!("{}", cmd);
    }
}

/// Faz testes nos programas localizados em testes/
fn test_programs() {
    use std::{fs, thread, process};
    use vm::VM;
    let files =
{'fraction_non_alphanumeric': 0.13592530231134242, 'fraction_numerical': 0.002449104546150314, 'mean_word_length': 2.00967296176877, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 33, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6759162', 'n_tokens_mistral': 2233, 'n_tokens_neox': 2178, 'n_words': 612}