use crate::{expr::{Expr, Index}, value::Value, parse::helpers::*}; use std::str::FromStr; grammar; extern { type Error = RevalParseError; } match { "=" => OP_EQ1, "==" => OP_EQ2, "!=" => OP_NEQ, ">" => OP_GT, "<" => OP_LT, ">=" => OP_GTE, "<=" => OP_LTE, "+" => OP_ADD, "-" => OP_SUB, "*" => OP_MULT, "/" => OP_DIV, "!" => OP_NOT, "&" => OP_BIT_AND, "|" => OP_BIT_OR, "^" => OP_BIT_XOR, "and" => KWD_AND, "or" => KWD_OR, "if" => KWD_IF, "then" => KWD_THEN, "else" => KWD_ELSE, "is_some" => KWD_IS_SOME, "is_none" => KWD_IS_NONE, "none" => KWD_NONE, "some" => KWD_SOME, "int" => KWD_INT, "float" => KWD_FLOAT, "dec" => KWD_DEC, "contains" => KWD_CONTAINS, "in" => KWD_IN, "date_time" => KWD_DATE_TIME, "datetime" => KWD_DATETIME, "duration" => KWD_DURATION, "to_upper" => KWD_TO_UPPER, "to_lower" => KWD_TO_LOWER, "uppercase" => KWD_UPPERCASE, "lowercase" => KWD_LOWERCASE, "trim" => KWD_TRIM, "round" => KWD_ROUND, "floor" => KWD_FLOOR, "fract" => KWD_FRACT, "year" => KWD_YEAR, "month" => KWD_MONTH, "week" => KWD_WEEK, "day" => KWD_DAY, "hour" => KWD_HOUR, "minute" => KWD_MINUTE, "second" => KWD_SECOND, "," => COMMA, ":" => COLON, "." => DOT, "(" => LPAREN, ")" => RPAREN, "[" => LBRACKET, "]" => RBRACKET, "{" => LBRACE, "}" => RBRACE, r#""[^"\\]*(?:\\.[^"\\]*)*""# => STRING, r"i[+-]?[0-9]+" => INT, r"0x[0-9a-fA-F]+" => HEX_INT, r"0o[0-8]+" => OCT_INT, r"0b[01]+" => BIN_INT, r"f[+-]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?" => FLOAT, r"d[+-]?[0-9]*\.?[0-9]+" => DECIMAL, "true" => TRUE, "false" => FALSE, r"\s*" => { }, // The default whitespace skipping is disabled if an `ignore pattern` is specified r"//[^\n\r]*[\n\r]*" => { }, // Skip `// comments` } else { r"[a-zA-Z][_a-zA-Z0-9]*" => IDENT, r"[0-9]+" => INDEX, } pub Expr: Expr = IfExpr; IfExpr: Expr = { KWD_IF KWD_THEN KWD_ELSE => Expr::iif(iif, thn, els), LogExpr } LogExpr: Expr = { KWD_AND => Expr::and(l, r), KWD_OR => Expr::or(l, r), EqExpr } EqExpr: Expr = { OP_EQ1 => Expr::eq(l, r), OP_EQ2 => Expr::eq(l, r), OP_NEQ => Expr::neq(l, r), OP_GT => Expr::gt(l, r), OP_LT => Expr::lt(l, r), OP_GTE => Expr::gte(l, r), OP_LTE => Expr::lte(l, r), AddExpr } AddExpr: Expr = { OP_ADD => Expr::add(l, r), OP_SUB => Expr::sub(l, r), MultExpr } MultExpr: Expr = { OP_MULT => Expr::mult(l, r), OP_DIV => Expr::div(l, r), BitExpr } BitExpr: Expr = { OP_BIT_AND => Expr::bitwise_and(l, r), OP_BIT_OR => Expr::bitwise_or(l, r), OP_BIT_XOR => Expr::bitwise_xor(l, r), ContainsExpr } ContainsExpr: Expr = { KWD_CONTAINS => Expr::contains(l, r), KWD_IN => Expr::contains(r, l), IndexExpr } IndexExpr: Expr = { DOT => Expr::index(l, Index::from(r)), DOT => Expr::index(l, Index::from(usize::from_str(r).unwrap())), Term } Term: Expr = { Func, Ref, Symbol, VecExpr, MapExpr, Value => Expr::Value(<>), LPAREN RPAREN }; Func: Expr = { KWD_INT LPAREN RPAREN => Expr::int(e), KWD_FLOAT LPAREN RPAREN => Expr::float(e), KWD_DEC LPAREN RPAREN => Expr::dec(e), KWD_DATE_TIME LPAREN RPAREN => Expr::datetime(e), KWD_DATETIME LPAREN RPAREN => Expr::datetime(e), KWD_DURATION LPAREN RPAREN => Expr::duration(e), KWD_IS_SOME LPAREN RPAREN => Expr::some(e), KWD_IS_NONE LPAREN RPAREN => Expr::none(e), KWD_SOME LPAREN RPAREN => Expr::some(e), KWD_NONE LPAREN RPAREN => Expr::none(e), OP_SUB LPAREN RPAREN => Expr::neg(e), OP_NOT LPAREN RPAREN => Expr::not(e), KWD_TO_UPPER LPAREN RPAREN => Expr::uppercase(e), KWD_TO_LOWER LPAREN RPAREN => Expr::lowercase(e), KWD_UPPERCASE LPAREN RPAREN => Expr::uppercase(e), KWD_LOWERCASE LPAREN RPAREN => Expr::lowercase(e), KWD_TRIM LPAREN RPAREN => Expr::trim(e), KWD_ROUND LPAREN RPAREN => Expr::round(e), KWD_FLOOR LPAREN RPAREN => Expr::floor(e), KWD_FRACT LPAREN RPAREN => Expr::fract(e), KWD_YEAR LPAREN RPAREN => Expr::year(e), KWD_MONTH LPAREN RPAREN => Expr::month(e), KWD_WEEK LPAREN RPAREN => Expr::week(e), KWD_DAY LPAREN RPAREN => Expr::day(e), KWD_HOUR LPAREN RPAREN => Expr::hour(e), KWD_MINUTE LPAREN RPAREN => Expr::minute(e), KWD_SECOND LPAREN RPAREN => Expr::second(e), LPAREN RPAREN => Expr::func(f, e), } Ref: Expr = => Expr::reff(<>); Symbol: Expr = COLON => Expr::symbol(s); VecExpr: Expr = LBRACKET COMMA)*> RBRACKET => Expr::Vec(e0.into_iter().chain(e1).collect()); MapExpr: Expr = LBRACE COMMA)*> RBRACE => Expr::Map(kv0.into_iter().chain(kv1).collect()); MapItem: (String, Expr) = COLON => (k.to_string(), e); Value: Value = { StringValue, IntValue, HexIntValue, OctIntValue, BinIntValue, FloatValue, DecimalValue, BoolValue, NoneValue, }; StringValue: Value = =>? Ok(parse_string_literal(s)?); IntValue: Value = =>? Ok(parse_int_value(s)?); HexIntValue: Value = =>? Ok(parse_hex_int_value(s)?); OctIntValue: Value = =>? Ok(parse_oct_int_value(s)?); BinIntValue: Value = =>? Ok(parse_bin_int_value(s)?); FloatValue: Value = =>? Ok(parse_float_value(s)?); DecimalValue: Value = =>? Ok(parse_decimal_value(s)?); BoolValue: Value = { TRUE => Value::Bool(true), FALSE => Value::Bool(false) }; NoneValue: Value = KWD_NONE => Value::None;