Skip to content

Instantly share code, notes, and snippets.

@stmtk1
Created December 5, 2019 03:29
Show Gist options
  • Save stmtk1/b4eb9916530de0600f2393b67f9d3bd4 to your computer and use it in GitHub Desktop.
Save stmtk1/b4eb9916530de0600f2393b67f9d3bd4 to your computer and use it in GitHub Desktop.
use std::io::{self, Read};
use std::rc::Rc;
use std::cell::RefCell;
fn main() -> io::Result<()>{
let mut buffer = String::new();
let stdin = io::stdin();
let mut handle = stdin.lock();
handle.read_to_string(&mut buffer)?;
let tokens = str2token(buffer);
println!("{:?}", tokens);
Ok(())
}
#[derive(Clone, Debug)]
enum Token {
Plus(u64),
Minus(u64),
Prev(u64),
Next(u64),
WhileStart,
WhileEnd,
Input,
Output,
}
fn str2token(input: String) -> Vec<Token> {
let mut ret: Vec<Token> = Vec::new();
for &b in input.as_bytes() {
match b as char {
'+' => ret.push(Token::Plus(1)),
'-' => ret.push(Token::Minus(1)),
'<' => ret.push(Token::Prev(1)),
'>' => ret.push(Token::Next(1)),
'[' => ret.push(Token::WhileStart),
']' => ret.push(Token::WhileEnd),
',' => ret.push(Token::Input),
'.' => ret.push(Token::Output),
'\n' => (),
_ => panic!("invalid string"),
}
}
ret
}
fn make_tree(tokens: Vec<Token>) -> TokenTree {
let mut ret = TokenTree::root();
for token in &tokens {
ret.add_child(TokenTree::new(token.clone()));
}
ret
}
#[derive(Clone, Debug)]
struct TokenTree {
value: Option<Token>, // root node have no value
children: Vec<Rc<RefCell<TokenTree>>>,
}
impl TokenTree {
fn new(value: Token) -> TokenTree {
TokenTree {
value: Some(value),
children: Vec::new(),
}
}
fn add_child(&mut self, child: TokenTree) {
let sub_tree = Rc::new(RefCell::new(child));
self.children.push(sub_tree);
}
fn root() -> TokenTree {
TokenTree {
value: None,
children: Vec::new(),
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment