From a9044f62f4564c46b3a8c7d3028c7259ded1611e Mon Sep 17 00:00:00 2001 From: Iwan Snel Date: Mon, 20 Oct 2025 19:29:49 +0200 Subject: [PATCH] initial commit --- src/ast/comparison.rs | 0 src/ast/evaluable.rs | 0 src/ast/expression.rs | 0 src/ast/literal.rs | 0 src/ast/logical.rs | 0 src/ast/mod.rs | 0 src/ast/operators.rs | 0 src/expressions.lalrpop | 0 src/grammar.ebnf | 0 src/literals.lalrpop | 13 ++++++++ src/main.rs | 6 ++++ src/optimising/constfolding.rs | 0 src/optimising/mod.rs | 0 src/tests/expressions.rs | 0 src/tests/literals.rs | 0 src/tests/mod.rs | 57 ++++++++++++++++++++++++++++++++++ 16 files changed, 76 insertions(+) create mode 100644 src/ast/comparison.rs create mode 100644 src/ast/evaluable.rs create mode 100644 src/ast/expression.rs create mode 100644 src/ast/literal.rs create mode 100644 src/ast/logical.rs create mode 100644 src/ast/mod.rs create mode 100644 src/ast/operators.rs create mode 100644 src/expressions.lalrpop create mode 100644 src/grammar.ebnf create mode 100644 src/literals.lalrpop create mode 100644 src/main.rs create mode 100644 src/optimising/constfolding.rs create mode 100644 src/optimising/mod.rs create mode 100644 src/tests/expressions.rs create mode 100644 src/tests/literals.rs create mode 100644 src/tests/mod.rs diff --git a/src/ast/comparison.rs b/src/ast/comparison.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/ast/evaluable.rs b/src/ast/evaluable.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/ast/expression.rs b/src/ast/expression.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/ast/literal.rs b/src/ast/literal.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/ast/logical.rs b/src/ast/logical.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/ast/mod.rs b/src/ast/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/ast/operators.rs b/src/ast/operators.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/expressions.lalrpop b/src/expressions.lalrpop new file mode 100644 index 0000000..e69de29 diff --git a/src/grammar.ebnf b/src/grammar.ebnf new file mode 100644 index 0000000..e69de29 diff --git a/src/literals.lalrpop b/src/literals.lalrpop new file mode 100644 index 0000000..0c256c9 --- /dev/null +++ b/src/literals.lalrpop @@ -0,0 +1,13 @@ +use std::str::FromStr; + +grammar; + +pub Atom: f64 = { + => n as f64, + Float, + "(" ")", +}; + +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 new file mode 100644 index 0000000..cdcec57 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,6 @@ +mod ast; +mod optimising; + +fn main() { + println!("Hello, world!"); +} diff --git a/src/optimising/constfolding.rs b/src/optimising/constfolding.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/optimising/mod.rs b/src/optimising/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/expressions.rs b/src/tests/expressions.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/literals.rs b/src/tests/literals.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/tests/mod.rs b/src/tests/mod.rs new file mode 100644 index 0000000..be8226d --- /dev/null +++ b/src/tests/mod.rs @@ -0,0 +1,57 @@ +#[cfg(test)] +mod test { + use crate::grammar; + use grammar::AtomParser as Parser; + #[test] + fn int_literals() { + assert!(Parser::new().parse("22").is_ok()); + assert!(Parser::new().parse("(22)").is_ok()); + assert!(Parser::new().parse("((22))").is_ok()); + } + + #[test] + fn test_float_dots() { + assert!(Parser::new().parse("1.1").is_ok()); + assert!(Parser::new().parse("-1.1").is_ok()); + assert!(Parser::new().parse(".1").is_ok()); + assert!(Parser::new().parse("-.1").is_ok()); + } + + #[test] + fn test_float_exps() { + assert!(Parser::new().parse("(1e1)").is_ok()); + assert!(Parser::new().parse("(-1e1)").is_ok()); + assert!(Parser::new().parse("(1e-1)").is_ok()); + assert!(Parser::new().parse("(-1e-1)").is_ok()); + assert!(Parser::new().parse("(1E1)").is_ok()); + assert!(Parser::new().parse("(-1E1)").is_ok()); + assert!(Parser::new().parse("(1E-1)").is_ok()); + assert!(Parser::new().parse("(-1E-1)").is_ok()); + assert!(Parser::new().parse("(1.1e1)").is_ok()); + assert!(Parser::new().parse("(-1.1e1)").is_ok()); + assert!(Parser::new().parse("(1.1e-1)").is_ok()); + assert!(Parser::new().parse("(-1.1e-1)").is_ok()); + assert!(Parser::new().parse("(1.1E1)").is_ok()); + assert!(Parser::new().parse("(-1.1E1)").is_ok()); + assert!(Parser::new().parse("(1.1E-1)").is_ok()); + assert!(Parser::new().parse("(-1.1E-1)").is_ok()); + + assert!(Parser::new().parse("(1.0e1)").is_ok()); + assert!(Parser::new().parse("(-0.1e1)").is_ok()); + assert!(Parser::new().parse("(1.0e-1)").is_ok()); + assert!(Parser::new().parse("(-1.0e-1)").is_ok()); + assert!(Parser::new().parse("(1.E1)").is_err()); + assert!(Parser::new().parse("(-1E1)").is_ok()); + assert!(Parser::new().parse("(1E-10)").is_ok()); + assert!(Parser::new().parse("(-1E-1)").is_ok()); + assert!(Parser::new().parse("(1.1e1)").is_ok()); + assert!(Parser::new().parse("(-1.1e1)").is_ok()); + assert!(Parser::new().parse("(1.1e-1)").is_ok()); + assert!(Parser::new().parse("(-1.1e-1)").is_ok()); + assert!(Parser::new().parse("(1.1E1)").is_ok()); + assert!(Parser::new().parse("(-1.1E1)").is_ok()); + assert!(Parser::new().parse("(1.1E-1)").is_ok()); + assert!(Parser::new().parse("(-1.1E-1)").is_ok()); + assert!(Parser::new().parse("FOOBAR").is_err()); + } +}