use super::tokenize;
use super::Token;
use super::Token::*;
fn generate(tokens: &[Token]) -> String {
let mut output = String::from(include_str!("preface.cpp"));
let mut indent = 1;
for &token in tokens {
match token {
Add => {
for _ in 0..indent {
output.push('\t');
}
output.push_str("++*ptr;\n");
}
Sub => {
for _ in 0..indent {
output.push('\t');
}
output.push_str("--*ptr;\n");
}
Right => {
for _ in 0..indent {
output.push('\t');
}
output.push_str("++ptr;\n");
}
Left => {
for _ in 0..indent {
output.push('\t');
}
output.push_str("--ptr;\n");
}
Read => {
for _ in 0..indent {
output.push('\t');
}
output.push_str("*ptr = getchar();\n");
}
Write => {
for _ in 0..indent {
output.push('\t');
}
output.push_str("putchar(*ptr);\n");
}
BeginLoop => {
indent += 1;
for _ in 0..(indent - 1) {
output.push('\t');
}
output.push_str("while (*ptr) {\n");
}
EndLoop => {
indent -= 1;
for _ in 0..indent {
output.push('\t');
}
output.push_str("}\n");
}
}
}
output.push_str("}\n");
output
}
pub fn brains(input: &str) -> String {
let tokens = tokenize(input);
generate(&tokens)
}