Implement basic parser
This commit is contained in:
39
src/parser.rs
Normal file
39
src/parser.rs
Normal file
@@ -0,0 +1,39 @@
|
||||
use crate::lexer::Token;
|
||||
use crate::lexer::Tokens;
|
||||
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Datum {
|
||||
Boolean(bool),
|
||||
Number(i64),
|
||||
Symbol(String),
|
||||
List(Vec<Datum>),
|
||||
}
|
||||
|
||||
pub fn parse(tokens: Tokens) -> Datum {
|
||||
let (datum, _) = parse_datum(&tokens, 0);
|
||||
datum
|
||||
}
|
||||
|
||||
fn parse_datum(tokens: &Tokens, ix: usize) -> (Datum, usize) {
|
||||
match &tokens[ix] {
|
||||
Token::Identifier(s) => (Datum::Symbol(s.to_string()), ix + 1),
|
||||
Token::Boolean(b) => (Datum::Boolean(*b), ix + 1),
|
||||
Token::Number(n) => (Datum::Number(*n), ix + 1),
|
||||
Token::LeftRoundBracket => parse_list(tokens, ix + 1),
|
||||
_ => panic!("Unexpected token {:?}", tokens[ix])
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_list(tokens: &Tokens, mut ix: usize) -> (Datum, usize) {
|
||||
let mut datums = vec![];
|
||||
|
||||
// FIXME: will crash when RightRoundBracket is missing
|
||||
while tokens[ix] != Token::RightRoundBracket {
|
||||
let (datum, new_ix) = parse_datum(tokens, ix);
|
||||
datums.push(datum);
|
||||
ix = new_ix;
|
||||
}
|
||||
|
||||
(Datum::List(datums), ix + 1)
|
||||
}
|
||||
Reference in New Issue
Block a user