Parses (
This commit is contained in:
parent
38e85e2c78
commit
42b9507af0
@ -1,5 +1,7 @@
|
|||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use schala_lib::{ProgrammingLanguageInterface, EvalOptions, ReplOutput};
|
use schala_lib::{ProgrammingLanguageInterface, EvalOptions, ReplOutput};
|
||||||
|
use std::iter::Peekable;
|
||||||
|
use std::str::Chars;
|
||||||
|
|
||||||
pub struct Rukka { }
|
pub struct Rukka { }
|
||||||
|
|
||||||
@ -18,7 +20,10 @@ impl ProgrammingLanguageInterface for Rukka {
|
|||||||
|
|
||||||
fn evaluate_in_repl(&mut self, input: &str, _eval_options: &EvalOptions) -> ReplOutput {
|
fn evaluate_in_repl(&mut self, input: &str, _eval_options: &EvalOptions) -> ReplOutput {
|
||||||
let mut output = ReplOutput::default();
|
let mut output = ReplOutput::default();
|
||||||
output.add_output(parse(input).and_then(|x| eval(x)).unwrap());
|
match parse(input).and_then(|x| eval(x)) {
|
||||||
|
Ok(s) => output.add_output(s),
|
||||||
|
Err(e) => output.add_output(format!("Error: {}", e))
|
||||||
|
};
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -27,41 +32,16 @@ fn eval(ast: Sexp) -> Result<String, String> {
|
|||||||
Ok(format!("Everything is ()"))
|
Ok(format!("Everything is ()"))
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Token {
|
|
||||||
LParen,
|
|
||||||
RParen,
|
|
||||||
Symbol(String)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn tokenize(input: &str) -> Vec<Token> {
|
|
||||||
let mut iter = input.chars().peekable();
|
|
||||||
let mut tokens = Vec::new();
|
|
||||||
loop {
|
|
||||||
match iter.next() {
|
|
||||||
None => break,
|
|
||||||
Some('(') => tokens.push(LParen),
|
|
||||||
Some(')') => tokens.push(RParen),
|
|
||||||
Some(c) if c.is_whitespace() => continue,
|
|
||||||
Some(c) => {
|
|
||||||
let mut sym = String::new();
|
|
||||||
loop {
|
|
||||||
match iter.peek() {
|
|
||||||
None | Some('(') | Some(')') => break,
|
|
||||||
Some(c) if c.is_whitespace() => break,
|
|
||||||
Some(c) => sym.push_char(c),
|
|
||||||
}
|
|
||||||
iter.next();
|
|
||||||
}
|
|
||||||
tokens.push(Symbol(sym));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tokens
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse(input: &str) -> Result<Sexp, String> {
|
fn parse(input: &str) -> Result<Sexp, String> {
|
||||||
let _tokens = tokenize(input);
|
let mut iter: Peekable<Chars> = input.chars().peekable();
|
||||||
Ok(Sexp::Atom(AtomT::Number(1)))
|
read_sexp(iter)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_sexp(mut input: Peekable<Chars>) -> Result<Sexp, String> {
|
||||||
|
if input.next() != Some('(') {
|
||||||
|
return Err(format!("Expected '('"));
|
||||||
|
}
|
||||||
|
Ok(Sexp::Atom(AtomT::Number(4)))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
Loading…
Reference in New Issue
Block a user