use crate::ast::{SimplExpr::{self, *}, BinOp::*, UnaryOp::*}; use eww_shared_util::{Span, VarName}; use crate::parser::lexer::{Token, LexicalError, StrLitSegment, Sp}; use crate::parser::lalrpop_helpers::*; grammar(fid: usize); extern { type Location = usize; type Error = LexicalError; enum Token { "+" => Token::Plus, "-" => Token::Minus, "*" => Token::Times, "/" => Token::Div, "%" => Token::Mod, "==" => Token::Equals, "!=" => Token::NotEquals, "&&" => Token::And, "||" => Token::Or, ">" => Token::GT, "<" => Token::LT, "?:" => Token::Elvis, "=~" => Token::RegexMatch, "!" => Token::Not, "," => Token::Comma, "?" => Token::Question, ":" => Token::Colon, "(" => Token::LPren, ")" => Token::RPren, "[" => Token::LBrack, "]" => Token::RBrack, "{" => Token::LCurl, "}" => Token::RCurl, "." => Token::Dot, "true" => Token::True, "false" => Token::False, "identifier" => Token::Ident(), "number" => Token::NumLit(), "string" => Token::StringLit(>>), } } Comma: Vec = { ",")*> => match e { None => v, Some(e) => { v.push(e); v } } }; pub Expr: SimplExpr = { #[precedence(level="0")] =>? parse_stringlit(Span(l, r, fid), x), => SimplExpr::literal(Span(l, r, fid), x), "true" => SimplExpr::literal(Span(l, r, fid), "true".into()), "false" => SimplExpr::literal(Span(l, r, fid), "false".into()), => VarRef(Span(l, r, fid), VarName(ident.to_string())), "(" ")", "[" > "]" => SimplExpr::JsonArray(Span(l, r, fid), values), "{" > "}" => SimplExpr::JsonObject(Span(l, r, fid), values), #[precedence(level="1")] #[assoc(side="right")] "(" > ")" => FunctionCall(Span(l, r, fid), ident, args), "[" "]" => JsonAccess(Span(l, r, fid), b(value), b(index)), "." => { JsonAccess(Span(l, r, fid), b(value), b(Literal(index.into()))) }, #[precedence(level="2")] #[assoc(side="right")] "!" => UnaryOp(Span(l, r, fid), Not, b(e)), #[precedence(level="3")] #[assoc(side="left")] "*" => BinOp(Span(l, r, fid), b(le), Times, b(re)), "/" => BinOp(Span(l, r, fid), b(le), Div, b(re)), "%" => BinOp(Span(l, r, fid), b(le), Mod, b(re)), #[precedence(level="4")] #[assoc(side="left")] "+" => BinOp(Span(l, r, fid), b(le), Plus, b(re)), "-" => BinOp(Span(l, r, fid), b(le), Minus, b(re)), #[precedence(level="5")] #[assoc(side="left")] "==" => BinOp(Span(l, r, fid), b(le), Equals, b(re)), "!=" => BinOp(Span(l, r, fid), b(le), NotEquals, b(re)), ">" => BinOp(Span(l, r, fid), b(le), GT, b(re)), "<" => BinOp(Span(l, r, fid), b(le), LT, b(re)), "=~" => BinOp(Span(l, r, fid), b(le), RegexMatch, b(re)), #[precedence(level="6")] #[assoc(side="left")] "&&" => BinOp(Span(l, r, fid), b(le), And, b(re)), "||" => BinOp(Span(l, r, fid), b(le), Or, b(re)), "?:" => BinOp(Span(l, r, fid), b(le), Elvis, b(re)), #[precedence(level="7")] #[assoc(side="right")] "?" ":" => { IfElse(Span(l, r, fid), b(cond), b(then), b(els)) }, }; ExprReset = ; JsonKeyValue = ":" ;