feat(parser): add support for and/or chaining

This commit is contained in:
rvcas
2023-08-14 17:18:11 -04:00
committed by Lucas
parent 4a1ae9f412
commit ab3a418b9c
9 changed files with 53 additions and 9 deletions

View File

@@ -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(),

View File

@@ -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;

View File

@@ -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,

View File

@@ -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 => ".",