diff --git a/src/ast/ast_node.rs b/src/ast/ast_node.rs new file mode 100644 index 0000000..d2e08a6 --- /dev/null +++ b/src/ast/ast_node.rs @@ -0,0 +1,3 @@ +pub trait ASTNode { + fn repr_c(&self) -> String; +} \ No newline at end of file diff --git a/src/ast/evaluable.rs b/src/ast/evaluable.rs deleted file mode 100644 index 31eb3e3..0000000 --- a/src/ast/evaluable.rs +++ /dev/null @@ -1,4 +0,0 @@ -/// A node that is evaluable to type `T` -pub trait Evaluable { - fn evaluate(&self) -> T; -} \ No newline at end of file diff --git a/src/ast/expression.rs b/src/ast/expression.rs index 87cf609..0447329 100644 --- a/src/ast/expression.rs +++ b/src/ast/expression.rs @@ -1,23 +1,6 @@ use crate::ast::literal::Literal; +use crate::ast::ast_node::ASTNode; pub enum Expression { - Identifier(String), Literal(Literal), - - Addition(Box, Box), - Subtraction(Box, Box), - Multiplication(Box, Box), - Division(Box, Box), - Remainder(Box, Box), - Negation(Box), - - And(Box, Box), - Or(Box, Box), - - Equal(Box, Box), - NotEqual(Box, Box), - Less(Box, Box), - LessEqual(Box, Box), - Greater(Box, Box), - GreaterEqual(Box, Box), -} +} \ No newline at end of file diff --git a/src/ast/literal.rs b/src/ast/literal.rs index 1c40790..e7ca7bf 100644 --- a/src/ast/literal.rs +++ b/src/ast/literal.rs @@ -1,5 +1,7 @@ +#[derive(Debug)] pub enum Literal { Int(i64), Float(f64), Bool(bool), } + diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 088b33b..1c23b8f 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1,4 +1,4 @@ -mod evaluable; +mod ast_node; pub mod literal; pub mod expression; pub mod logical; diff --git a/src/expressions.lalrpop b/src/expressions.lalrpop index 5129355..d506f20 100644 --- a/src/expressions.lalrpop +++ b/src/expressions.lalrpop @@ -1,9 +1,18 @@ -use crate::ast::expression::Expression; +use crate::ast::literal::Literal; + grammar; -pub ASTExpression: Expression = { - => Expression::Identifier(String::from(s)), +pub ASTExpression: Literal = { + => a, }; -pub Identifier: &'input str = => s; \ No newline at end of file +pub Atom: Literal = { + => Literal::Int(n), + => Literal::Float(f), + "(" ")" => f, +}; + +pub Int: i64 = => s.parse::().unwrap(); +pub Float: f64 = => s.parse::().unwrap(); +// pub Identifier: &'input str = => s; diff --git a/src/literals.lalrpop b/src/literals.lalrpop deleted file mode 100644 index 7254c1e..0000000 --- a/src/literals.lalrpop +++ /dev/null @@ -1,14 +0,0 @@ -use std::str::FromStr; -use crate::ast::literal::Literal; - -grammar; - -pub Atom: Literal = { - => Literal::Int(n), - => Literal::Float(f), - "(" ")" => f, -}; - -pub Int: i64 = => i64::from_str(s).unwrap(); -pub Float: f64 = => f64::from_str(s).unwrap(); -//pub StringLiteral: &'input str = => s; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 65d0080..9df9d10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,8 @@ use lalrpop_util::lalrpop_mod; - mod ast; mod optimising; mod tests; -lalrpop_mod!(pub literals); lalrpop_mod!(pub expressions); fn main() { diff --git a/src/tests/expressions.rs b/src/tests/expressions.rs index d319aa2..cf4fddd 100644 --- a/src/tests/expressions.rs +++ b/src/tests/expressions.rs @@ -1,16 +1,16 @@ - - -#[test] -fn identifiers() { - use crate::expressions::IdentifierParser as IdentParser; - assert!(IdentParser::new().parse("a").is_ok()); - assert!(IdentParser::new().parse("_").is_ok()); - assert!(IdentParser::new().parse("a_a_a_").is_ok()); - assert!(IdentParser::new().parse("_0").is_ok()); - assert!(IdentParser::new().parse("_a").is_ok()); - assert!(IdentParser::new().parse("__").is_ok()); - - assert!(IdentParser::new().parse("0").is_err()); - assert!(IdentParser::new().parse("0123456").is_err()); - assert!(IdentParser::new().parse("0aaaa").is_err()); -} \ No newline at end of file +// +// +// #[test] +// fn identifiers() { +// use crate::expressions::IdentifierParser as IdentParser; +// assert!(IdentParser::new().parse("a").is_ok()); +// assert!(IdentParser::new().parse("_").is_ok()); +// assert!(IdentParser::new().parse("a_a_a_").is_ok()); +// assert!(IdentParser::new().parse("_0").is_ok()); +// assert!(IdentParser::new().parse("_a").is_ok()); +// assert!(IdentParser::new().parse("__").is_ok()); +// +// assert!(IdentParser::new().parse("0").is_err()); +// assert!(IdentParser::new().parse("0123456").is_err()); +// assert!(IdentParser::new().parse("0aaaa").is_err()); +// } \ No newline at end of file diff --git a/src/tests/literals.rs b/src/tests/literals.rs index a076262..547abbf 100644 --- a/src/tests/literals.rs +++ b/src/tests/literals.rs @@ -1,6 +1,5 @@ -use crate::literals::AtomParser as Parser; -use std::any::type_name_of_val; -use std::convert::identity; +use crate::ast::literal::Literal; +use crate::expressions::AtomParser as Parser; #[test] fn int_literals() { @@ -28,7 +27,7 @@ fn test_float_dots() { #[test] fn test_float_exps() { - let parser = crate::literals::FloatParser::new(); + let parser = crate::expressions::FloatParser::new(); let valid_float_exps: Vec<&str> = vec![ "1e1", "-1e1", "1e-1", "-1e-1", "1.1e1", "1.1e-1", "-1.1e1", "-1.1e-1", ".1e1", "-.1e1", @@ -36,14 +35,46 @@ fn test_float_exps() { "-.1E1", "-.1E-1", ]; - let invalid_float_exps: Vec<&str> = vec!["AAAAAAAAAAAAAAA", "1.e1", "1e1.1", "1.1e1.1", "-1e1.1", "1e-1.1"]; + let invalid_float_exps: Vec<&str> = vec![ + "AAAAAAAAAAAAAAA", + "1.e1", + "1e1.1", + "1.1e1.1", + "-1e1.1", + "1e-1.1", + ]; assert!( valid_float_exps .into_iter() .all(|s| parser.parse(s).is_ok()) ); - assert!(invalid_float_exps - .into_iter() - .all(|s| parser.parse(s).is_err())); + assert!( + invalid_float_exps + .into_iter() + .all(|s| parser.parse(s).is_err()) + ); +} + +#[test] +fn test_atom_parser() { + use crate::ast::literal::Literal; + let parser = crate::expressions::AtomParser::new(); + + let parsed_int_atom = parser.parse("123"); + assert!(matches!(parsed_int_atom, Ok(Literal::Int(_)))); + + let parsed_int_atom = parser.parse("-1.12345"); + assert!(matches!(parsed_int_atom, Ok(Literal::Float(_)))); +} + +#[test] +fn test_expr_parser() { + let parser = crate::expressions::ASTExpressionParser::new(); + + let parsed_int_expr = parser.parse("123"); + assert!(matches!(parsed_int_expr, Ok(Literal::Int(_)))); + + let parsed_int_expr = parser.parse("-4.20E-69"); + assert!(matches!(parsed_int_expr, Ok(Literal::Float(_)))); }