feat(parser): add support for and/or chaining
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
use chumsky::prelude::*;
|
||||
|
||||
use super::anonymous_binop::parser as anonymous_binop;
|
||||
use super::anonymous_function::parser as anonymous_function;
|
||||
use super::assignment;
|
||||
use super::block::parser as block;
|
||||
@@ -14,6 +13,7 @@ use super::string::parser as string;
|
||||
use super::tuple::parser as tuple;
|
||||
use super::var::parser as var;
|
||||
use super::when::parser as when;
|
||||
use super::{and_or_chain, anonymous_binop::parser as anonymous_binop};
|
||||
|
||||
use crate::{
|
||||
expr::UntypedExpr,
|
||||
@@ -33,6 +33,7 @@ pub fn parser<'a>(
|
||||
field_access::parser(),
|
||||
call(expression.clone()),
|
||||
));
|
||||
|
||||
chain_start(sequence, expression)
|
||||
.then(chain.repeated())
|
||||
.foldl(|expr, chain| match chain {
|
||||
@@ -60,6 +61,7 @@ pub fn chain_start<'a>(
|
||||
record_update(expression.clone()),
|
||||
record(expression.clone()),
|
||||
field_access::constructor(),
|
||||
and_or_chain(expression.clone()),
|
||||
var(),
|
||||
tuple(expression.clone()),
|
||||
bytearray(),
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
use chumsky::prelude::*;
|
||||
use vec1::Vec1;
|
||||
|
||||
mod and_or_chain;
|
||||
mod anonymous_binop;
|
||||
pub mod anonymous_function;
|
||||
pub mod assignment;
|
||||
@@ -19,6 +20,7 @@ mod tuple;
|
||||
mod var;
|
||||
pub mod when;
|
||||
|
||||
pub use and_or_chain::parser as and_or_chain;
|
||||
pub use anonymous_function::parser as anonymous_function;
|
||||
pub use block::parser as block;
|
||||
pub use bytearray::parser as bytearray;
|
||||
|
||||
@@ -222,11 +222,12 @@ pub fn lexer() -> impl Parser<char, Vec<(Token, Span)>, Error = ParseError> {
|
||||
|
||||
let keyword = text::ident().map(|s: String| match s.as_str() {
|
||||
"trace" => Token::Trace,
|
||||
"fail" => Token::Fail,
|
||||
// TODO: delete this eventually
|
||||
// TODO: remove this in a future release
|
||||
"error" => Token::Fail,
|
||||
"fail" => Token::Fail,
|
||||
"as" => Token::As,
|
||||
"assert" => Token::Expect,
|
||||
"and" => Token::And,
|
||||
"or" => Token::Or,
|
||||
"expect" => Token::Expect,
|
||||
"const" => Token::Const,
|
||||
"fn" => Token::Fn,
|
||||
|
||||
@@ -56,6 +56,8 @@ pub enum Token {
|
||||
Vbar, // '|'
|
||||
VbarVbar, // '||'
|
||||
AmperAmper, // '&&'
|
||||
And, // and
|
||||
Or, // or
|
||||
NewLinePipe, // '↳|>'
|
||||
Pipe, // '|>'
|
||||
Dot, // '.'
|
||||
@@ -143,6 +145,8 @@ impl fmt::Display for Token {
|
||||
Token::Vbar => "|",
|
||||
Token::VbarVbar => "||",
|
||||
Token::AmperAmper => "&&",
|
||||
Token::And => "and",
|
||||
Token::Or => "or",
|
||||
Token::NewLinePipe => "↳|>",
|
||||
Token::Pipe => "|>",
|
||||
Token::Dot => ".",
|
||||
|
||||
Reference in New Issue
Block a user