Parsing partially done
This commit is contained in:
parent
32ba3f38c3
commit
102c35d654
4 changed files with 67 additions and 11 deletions
|
@ -38,7 +38,7 @@ impl LispState {
|
|||
todo!();
|
||||
}
|
||||
},
|
||||
OpCode::Eval(ins) => {
|
||||
OpCode::Exp(ins) => {
|
||||
self.execute(ins);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@ pub enum LispValue {
|
|||
Nil,
|
||||
String(String),
|
||||
LispFunction(String, Vec<OpCode>),
|
||||
RustFunction(String, fn(Vec<LispValue>) -> LispValue)
|
||||
RustFunction(String, fn(Vec<LispValue>) -> LispValue),
|
||||
Exp(OpCode)
|
||||
}
|
||||
|
||||
impl fmt::Display for LispValue {
|
||||
|
@ -15,7 +16,8 @@ impl fmt::Display for LispValue {
|
|||
LispValue::Nil => write!(f, "nil"),
|
||||
LispValue::String(str) => write!(f, "{}", str),
|
||||
LispValue::LispFunction(name, _) => write!(f, "<'{}': Lisp Function>", name),
|
||||
LispValue::RustFunction(name, _) => write!(f, "<'{}': Rust Function>", name)
|
||||
LispValue::RustFunction(name, _) => write!(f, "<'{}': Rust Function>", name),
|
||||
_ => todo!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,18 +36,66 @@ impl From<String> for LispValue {
|
|||
|
||||
pub enum OpCode {
|
||||
Call(String, Vec<LispValue>),
|
||||
Eval(Vec<OpCode>)
|
||||
Exp(Vec<OpCode>)
|
||||
}
|
||||
|
||||
// TODO: Handle failure
|
||||
fn read_exp(open_paren_idx: usize, tokens: &Vec<Token>) -> Option<(Vec<Token>, usize)> /* Option<tokens, close_paren_idx> */ {
|
||||
let mut tkns = Vec::new();
|
||||
let mut depth = 0;
|
||||
|
||||
for i in open_paren_idx..tokens.len() - 1 {
|
||||
match &tokens[i] {
|
||||
Token::OpenParen => {
|
||||
if depth != 0 {
|
||||
tkns.push(Token::OpenParen);
|
||||
}
|
||||
depth += 1;
|
||||
}
|
||||
Token::CloseParen => {
|
||||
depth -= 1;
|
||||
if depth == 0 {
|
||||
return Some((tkns, i));
|
||||
}
|
||||
}
|
||||
token => {
|
||||
tkns.push(token.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn parse_exp(tokens: Vec<Token>) -> Vec<OpCode> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
pub fn parse(tokens: Vec<Token>) -> Vec<OpCode> {
|
||||
let mut opcodes = Vec::new();
|
||||
|
||||
// TODO:
|
||||
opcodes.push(OpCode::Call("print".to_string(), vec![
|
||||
LispValue::from("Hello, World!")
|
||||
]));
|
||||
let mut current_depth = 0;
|
||||
let mut seeking = false;
|
||||
|
||||
let mut i = 0;
|
||||
while i < tokens.len() {
|
||||
match &tokens[i] {
|
||||
Token::OpenParen => {
|
||||
let (tkns, close_paren_idx) = read_exp(i, &tokens).unwrap();
|
||||
opcodes.push(OpCode::Exp(parse_exp(tkns)));
|
||||
i = close_paren_idx;
|
||||
}
|
||||
tkn => {
|
||||
panic!("Unexpected token {:?}", tkn);
|
||||
}
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
||||
|
||||
// opcodes.push(OpCode::Call("print".to_string(), vec![
|
||||
// LispValue::from("Hello, World!")
|
||||
// ]));
|
||||
|
||||
opcodes
|
||||
}
|
|
@ -1,4 +1,10 @@
|
|||
; This is a comment
|
||||
|
||||
(print "Hello, World") ; OpenParen, Identifier, String, CloseParen
|
||||
; (print (add 1 2)) ; OpenParen, Identifier, OpenParen, Identifier, Int, Int, CloseParen, CloseParen
|
||||
(print "Hello, World") ; OpCode::Call("print", {"Hello, World"})
|
||||
|
||||
(print (add 1 2))
|
||||
; OpCode::Call("print", {
|
||||
; OpCode::Exp({
|
||||
; OpCode::Call("add", 1, 2)
|
||||
; })
|
||||
; })
|
|
@ -1,6 +1,6 @@
|
|||
use std::fmt;
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Token {
|
||||
OpenParen,
|
||||
CloseParen,
|
||||
|
|
Reference in a new issue