Tests added for ASTExpression literals
This commit is contained in:
3
src/ast/ast_node.rs
Normal file
3
src/ast/ast_node.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pub trait ASTNode {
|
||||||
|
fn repr_c(&self) -> String;
|
||||||
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
/// A node that is evaluable to type `T`
|
|
||||||
pub trait Evaluable<T> {
|
|
||||||
fn evaluate(&self) -> T;
|
|
||||||
}
|
|
||||||
@@ -1,23 +1,6 @@
|
|||||||
use crate::ast::literal::Literal;
|
use crate::ast::literal::Literal;
|
||||||
|
use crate::ast::ast_node::ASTNode;
|
||||||
|
|
||||||
pub enum Expression {
|
pub enum Expression {
|
||||||
Identifier(String),
|
|
||||||
Literal(Literal),
|
Literal(Literal),
|
||||||
|
|
||||||
Addition(Box<Expression>, Box<Expression>),
|
|
||||||
Subtraction(Box<Expression>, Box<Expression>),
|
|
||||||
Multiplication(Box<Expression>, Box<Expression>),
|
|
||||||
Division(Box<Expression>, Box<Expression>),
|
|
||||||
Remainder(Box<Expression>, Box<Expression>),
|
|
||||||
Negation(Box<Expression>),
|
|
||||||
|
|
||||||
And(Box<Expression>, Box<Expression>),
|
|
||||||
Or(Box<Expression>, Box<Expression>),
|
|
||||||
|
|
||||||
Equal(Box<Expression>, Box<Expression>),
|
|
||||||
NotEqual(Box<Expression>, Box<Expression>),
|
|
||||||
Less(Box<Expression>, Box<Expression>),
|
|
||||||
LessEqual(Box<Expression>, Box<Expression>),
|
|
||||||
Greater(Box<Expression>, Box<Expression>),
|
|
||||||
GreaterEqual(Box<Expression>, Box<Expression>),
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
|
#[derive(Debug)]
|
||||||
pub enum Literal {
|
pub enum Literal {
|
||||||
Int(i64),
|
Int(i64),
|
||||||
Float(f64),
|
Float(f64),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
mod evaluable;
|
mod ast_node;
|
||||||
pub mod literal;
|
pub mod literal;
|
||||||
pub mod expression;
|
pub mod expression;
|
||||||
pub mod logical;
|
pub mod logical;
|
||||||
|
|||||||
@@ -1,9 +1,18 @@
|
|||||||
use crate::ast::expression::Expression;
|
use crate::ast::literal::Literal;
|
||||||
|
|
||||||
|
|
||||||
grammar;
|
grammar;
|
||||||
|
|
||||||
pub ASTExpression: Expression = {
|
pub ASTExpression: Literal = {
|
||||||
<s: Identifier> => Expression::Identifier(String::from(s)),
|
<a: Atom> => a,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub Identifier: &'input str = <s:r"[_a-zA-Z][_a-zA-Z0-9]*"> => s;
|
pub Atom: Literal = {
|
||||||
|
<n:Int> => Literal::Int(n),
|
||||||
|
<f: Float> => Literal::Float(f),
|
||||||
|
"(" <f: Atom> ")" => f,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub Int: i64 = <s:r"[0-9]|[1-9][0-9]*"> => s.parse::<i64>().unwrap();
|
||||||
|
pub Float: f64 = <s:r"[+-]?([0-9]*[.][0-9]+|[0-9]*([.][0-9]+)?[Ee][+-]?[1-9][0-9]*)"> => s.parse::<f64>().unwrap();
|
||||||
|
// pub Identifier: &'input str = <s:r"[_a-zA-Z][_a-zA-Z0-9]*"> => s;
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
use std::str::FromStr;
|
|
||||||
use crate::ast::literal::Literal;
|
|
||||||
|
|
||||||
grammar;
|
|
||||||
|
|
||||||
pub Atom: Literal = {
|
|
||||||
<n:Int> => Literal::Int(n),
|
|
||||||
<f: Float> => Literal::Float(f),
|
|
||||||
"(" <f: Atom> ")" => f,
|
|
||||||
};
|
|
||||||
|
|
||||||
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;
|
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
use lalrpop_util::lalrpop_mod;
|
use lalrpop_util::lalrpop_mod;
|
||||||
|
|
||||||
mod ast;
|
mod ast;
|
||||||
mod optimising;
|
mod optimising;
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
lalrpop_mod!(pub literals);
|
|
||||||
lalrpop_mod!(pub expressions);
|
lalrpop_mod!(pub expressions);
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
|
//
|
||||||
|
//
|
||||||
#[test]
|
// #[test]
|
||||||
fn identifiers() {
|
// fn identifiers() {
|
||||||
use crate::expressions::IdentifierParser as IdentParser;
|
// use crate::expressions::IdentifierParser as IdentParser;
|
||||||
assert!(IdentParser::new().parse("a").is_ok());
|
// assert!(IdentParser::new().parse("a").is_ok());
|
||||||
assert!(IdentParser::new().parse("_").is_ok());
|
// assert!(IdentParser::new().parse("_").is_ok());
|
||||||
assert!(IdentParser::new().parse("a_a_a_").is_ok());
|
// assert!(IdentParser::new().parse("a_a_a_").is_ok());
|
||||||
assert!(IdentParser::new().parse("_0").is_ok());
|
// assert!(IdentParser::new().parse("_0").is_ok());
|
||||||
assert!(IdentParser::new().parse("_a").is_ok());
|
// assert!(IdentParser::new().parse("_a").is_ok());
|
||||||
assert!(IdentParser::new().parse("__").is_ok());
|
// assert!(IdentParser::new().parse("__").is_ok());
|
||||||
|
//
|
||||||
assert!(IdentParser::new().parse("0").is_err());
|
// assert!(IdentParser::new().parse("0").is_err());
|
||||||
assert!(IdentParser::new().parse("0123456").is_err());
|
// assert!(IdentParser::new().parse("0123456").is_err());
|
||||||
assert!(IdentParser::new().parse("0aaaa").is_err());
|
// assert!(IdentParser::new().parse("0aaaa").is_err());
|
||||||
}
|
// }
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
use crate::literals::AtomParser as Parser;
|
use crate::ast::literal::Literal;
|
||||||
use std::any::type_name_of_val;
|
use crate::expressions::AtomParser as Parser;
|
||||||
use std::convert::identity;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn int_literals() {
|
fn int_literals() {
|
||||||
@@ -28,7 +27,7 @@ fn test_float_dots() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_float_exps() {
|
fn test_float_exps() {
|
||||||
let parser = crate::literals::FloatParser::new();
|
let parser = crate::expressions::FloatParser::new();
|
||||||
|
|
||||||
let valid_float_exps: Vec<&str> = vec![
|
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",
|
"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",
|
"-.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!(
|
assert!(
|
||||||
valid_float_exps
|
valid_float_exps
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.all(|s| parser.parse(s).is_ok())
|
.all(|s| parser.parse(s).is_ok())
|
||||||
);
|
);
|
||||||
assert!(invalid_float_exps
|
assert!(
|
||||||
|
invalid_float_exps
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.all(|s| parser.parse(s).is_err()));
|
.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(_))));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user