diff --git a/README.md b/README.md index 11c5b0f..c51e26a 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,5 @@ I've wanted to learn a lisp for a while now, but have never come further than the absolute basics. Also, I've never created a proper programming language before. So I decided to make one - inspired by my rudimentary understanding of lisp, combined with a bit of lua tables. + +https://github.com/quchen/stgi diff --git a/src/parse.rs b/src/parse.rs index b0c6ba2..20c3f6b 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1 +1,3 @@ +mod boolean; mod integer; +mod table; diff --git a/src/parse/boolean.rs b/src/parse/boolean.rs new file mode 100644 index 0000000..21ca693 --- /dev/null +++ b/src/parse/boolean.rs @@ -0,0 +1,8 @@ +use nom::branch::alt; +use nom::bytes::complete::tag; +use nom::combinator::map; +use nom::IResult; + +pub fn bool(input: &str) -> IResult<&str, bool> { + alt((map(tag("true"), |_| true), map(tag("false"), |_| false)))(input) +} diff --git a/src/parse/table.rs b/src/parse/table.rs new file mode 100644 index 0000000..2f409d5 --- /dev/null +++ b/src/parse/table.rs @@ -0,0 +1,37 @@ +use std::collections::HashMap; + +use nom::branch::alt; +use nom::character::complete::{char, multispace0}; +use nom::combinator::map; +use nom::sequence::{delimited, pair, tuple}; +use nom::IResult; + +use super::boolean::bool; +use super::integer::integer; + +enum Value { + Bool(bool), + Int(i64), + Table(Table), +} + +type Table = HashMap; + +fn value(input: &str) -> IResult<&str, Value> { + alt(( + map(bool, Value::Bool), + map(integer, Value::Int), + map(table, Value::Table), + ))(input) +} + +fn table(input: &str) -> IResult<&str, Table> { + map( + delimited( + pair(multispace0, char('(')), + char('*'), + pair(multispace0, char(')')), + ), + |_| HashMap::new(), + )(input) +}