Prechádzať zdrojové kódy

Added support for boolean literals

Cesar Rodas 9 mesiacov pred
rodič
commit
f4115ceb24

+ 4 - 0
utxo/src/filter_expr/compiler/mod.rs

@@ -44,6 +44,10 @@ impl<'a> Compiler<'a> {
                 vec![OpCode::LOAD_EXTERNAL(return_value, name.clone())],
                 return_value,
             ),
+            Expr::Bool(value) => (
+                vec![OpCode::LOAD(return_value, Value::Bool(*value))],
+                return_value,
+            ),
             Expr::String(string) => (
                 vec![OpCode::LOAD(return_value, Value::String(string.clone()))],
                 return_value,

+ 5 - 2
utxo/src/filter_expr/expr.pest

@@ -1,3 +1,4 @@
+COMMENT    = { "//" ~ (!NEWLINE ~ ANY)* ~ NEWLINE }
 WHITESPACE = _{ " " | "\t" | NEWLINE }
 
 query       = _{ SOI ~ where_clause? ~ limit_clause? ~ order_by_clause? ~ EOI }
@@ -10,11 +11,11 @@ expr        = _{ logical_expr }
 logical_expr = { logical_term ~ (logical_op ~ logical_term)* }
 logical_term = { not_expr | comparison }
 logical_op   = { ^"AND" |  "&&" | "||" | ^"OR" }
-not_expr     = { (^"NOT" | "!") ~ logical_term }
+not_expr     = { (^"NOT" | "!") ~ logical_expr }
 comparison   = { sum ~ (comp_op ~ sum)? }
 sum          = { product ~ (add_op ~ product)* }
 product      = { factor ~ (mul_op ~ factor)* }
-factor       = { number | string | variable | "(" ~ expr ~ ")" }
+factor       = { number | string | variable  | bool | "(" ~ expr ~ ")" }
 comp_op      = { "=" | "!=" | "<" | "<=" | ">" | ">=" }
 add_op       = { "+" | "-" }
 mul_op       = { "*" | "/" }
@@ -34,5 +35,7 @@ ident        = @{  ("_" | alpha) ~ ("_" | alpha_num)* }
 alpha        = _{ 'a'..'z' | 'A'..'Z' }
 alpha_num    = _{ alpha | '0'..'9' }
 
+bool        = @ { ^"TRUE" | ^"FALSE" }
+
 // number
 number       = @{ "-"? ~ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)? }

+ 1 - 0
utxo/src/filter_expr/expr.rs

@@ -74,6 +74,7 @@ pub enum Expr {
     Op { op: ExprOp, terms: Vec<Box<Expr>> },
     Variable(Variable),
     String(String),
+    Bool(bool),
     Number(i128),
 }
 

+ 1 - 1
utxo/src/filter_expr/filter.rs

@@ -90,7 +90,7 @@ impl<'a> Filter<'a> {
 
     /// Returns a human readable version of the compiled program (generated op-codes)
     pub fn debug(&self) -> String {
-        self.opcodes
+        self.dbg_opcodes
             .iter()
             .map(|x| match x {
                 OpCode::HLT(_) | OpCode::LABEL(_) => x.to_string(),

+ 2 - 0
utxo/src/filter_expr/parser.rs

@@ -133,6 +133,7 @@ fn parse_expr(pair: pest::iterators::Pair<Rule>) -> Result<Expr, Error> {
         }
         Rule::number => Expr::Number(pair.as_str().parse()?),
         Rule::ident => Expr::String(pair.as_str().to_owned()),
+        Rule::bool => Expr::Bool(pair.as_str().trim().to_lowercase() == "true"),
         rule => return Err(Error::UnexpectedRule(rule)),
     })
 }
@@ -188,6 +189,7 @@ pub fn parse_query(query: &str) -> Result<Query, Error> {
 
                 order_by_clause = Some((expr, order));
             }
+            Rule::COMMENT => {}
             _ => unreachable!(),
         }
     }