initial commit
This commit is contained in:
0
src/ast/comparison.rs
Normal file
0
src/ast/comparison.rs
Normal file
0
src/ast/evaluable.rs
Normal file
0
src/ast/evaluable.rs
Normal file
0
src/ast/expression.rs
Normal file
0
src/ast/expression.rs
Normal file
0
src/ast/literal.rs
Normal file
0
src/ast/literal.rs
Normal file
0
src/ast/logical.rs
Normal file
0
src/ast/logical.rs
Normal file
0
src/ast/mod.rs
Normal file
0
src/ast/mod.rs
Normal file
0
src/ast/operators.rs
Normal file
0
src/ast/operators.rs
Normal file
0
src/expressions.lalrpop
Normal file
0
src/expressions.lalrpop
Normal file
0
src/grammar.ebnf
Normal file
0
src/grammar.ebnf
Normal file
13
src/literals.lalrpop
Normal file
13
src/literals.lalrpop
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
grammar;
|
||||||
|
|
||||||
|
pub Atom: f64 = {
|
||||||
|
<n:Int> => n as f64,
|
||||||
|
Float,
|
||||||
|
"(" <Atom> ")",
|
||||||
|
};
|
||||||
|
|
||||||
|
pub Int: i64 = <s:r"[0-9]|[1-9][0-9]*"> => i64::from_str(s).unwrap();
|
||||||
|
pub Float: f64 = <s:r"[+-]?([0-9]*[.][0-9]+|[0-9]*([.][0-9]+)?[Ee][+-]?[1-9][0-9]*)"> => f64::from_str(s).unwrap();
|
||||||
|
pub StringLiteral: &'input str = <s:"\"[^\"]\""> => s;
|
||||||
6
src/main.rs
Normal file
6
src/main.rs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
mod ast;
|
||||||
|
mod optimising;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
||||||
0
src/optimising/constfolding.rs
Normal file
0
src/optimising/constfolding.rs
Normal file
0
src/optimising/mod.rs
Normal file
0
src/optimising/mod.rs
Normal file
0
src/tests/expressions.rs
Normal file
0
src/tests/expressions.rs
Normal file
0
src/tests/literals.rs
Normal file
0
src/tests/literals.rs
Normal file
57
src/tests/mod.rs
Normal file
57
src/tests/mod.rs
Normal file
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user