mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-01 07:41:12 +00:00
flesh out operators
This commit is contained in:
parent
f3456325fa
commit
2ced7ee5d8
3 changed files with 240 additions and 8 deletions
|
@ -8,8 +8,8 @@ pub enum Operator {
|
||||||
Star,
|
Star,
|
||||||
Slash,
|
Slash,
|
||||||
DoubleSlash,
|
DoubleSlash,
|
||||||
TildeSlash,
|
|
||||||
Percent,
|
Percent,
|
||||||
|
DoublePercent,
|
||||||
Plus,
|
Plus,
|
||||||
Minus,
|
Minus,
|
||||||
Equals,
|
Equals,
|
||||||
|
@ -54,7 +54,7 @@ impl Operator {
|
||||||
use self::Associativity::*;
|
use self::Associativity::*;
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
Pizza | Star | Slash | DoubleSlash | TildeSlash | Percent | Plus | Minus => {
|
Pizza | Star | Slash | DoubleSlash | DoublePercent | Percent | Plus | Minus => {
|
||||||
LeftAssociative
|
LeftAssociative
|
||||||
}
|
}
|
||||||
And | Or | Caret => RightAssociative,
|
And | Or | Caret => RightAssociative,
|
||||||
|
@ -65,7 +65,7 @@ impl Operator {
|
||||||
fn precedence(&self) -> u8 {
|
fn precedence(&self) -> u8 {
|
||||||
match self {
|
match self {
|
||||||
Caret => 7,
|
Caret => 7,
|
||||||
Star | Slash | DoubleSlash | TildeSlash | Percent => 6,
|
Star | Slash | DoubleSlash | DoublePercent | Percent => 6,
|
||||||
Plus | Minus => 5,
|
Plus | Minus => 5,
|
||||||
Equals | LessThan | GreaterThan | LessThanOrEq | GreaterThanOrEq => 4,
|
Equals | LessThan | GreaterThan | LessThanOrEq | GreaterThanOrEq => 4,
|
||||||
And => 3,
|
And => 3,
|
||||||
|
|
|
@ -31,10 +31,10 @@ use parse::blankspace::{
|
||||||
use parse::ident::{ident, Ident, MaybeQualified};
|
use parse::ident::{ident, Ident, MaybeQualified};
|
||||||
use parse::number_literal::number_literal;
|
use parse::number_literal::number_literal;
|
||||||
use parse::parser::{
|
use parse::parser::{
|
||||||
and, attempt, between, char, either, loc, map, map_with_arena, not_followed_by, one_of2,
|
and, attempt, between, char, either, loc, map, map_with_arena, not_followed_by, one_of16,
|
||||||
one_of4, one_of5, one_of9, one_or_more, optional, sep_by0, skip_first, skip_second, string,
|
one_of2, one_of4, one_of5, one_of9, one_or_more, optional, sep_by0, skip_first, skip_second,
|
||||||
then, unexpected, unexpected_eof, zero_or_more, Either, Fail, FailReason, ParseResult, Parser,
|
string, then, unexpected, unexpected_eof, zero_or_more, Either, Fail, FailReason, ParseResult,
|
||||||
State,
|
Parser, State,
|
||||||
};
|
};
|
||||||
use parse::string_literal::string_literal;
|
use parse::string_literal::string_literal;
|
||||||
use region::Located;
|
use region::Located;
|
||||||
|
@ -660,11 +660,25 @@ fn ident_to_expr<'a>(src: Ident<'a>) -> Expr<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn operator<'a>() -> impl Parser<'a, Operator> {
|
pub fn operator<'a>() -> impl Parser<'a, Operator> {
|
||||||
one_of4(
|
one_of16(
|
||||||
|
// Sorted from highest to lowest predicted usage in practice,
|
||||||
|
// so that successful matches shorrt-circuit as early as possible.
|
||||||
|
map(string("|>"), |_| Operator::Pizza),
|
||||||
|
map(string("=="), |_| Operator::Equals),
|
||||||
|
map(string("&&"), |_| Operator::And),
|
||||||
|
map(string("||"), |_| Operator::Or),
|
||||||
map(char('+'), |_| Operator::Plus),
|
map(char('+'), |_| Operator::Plus),
|
||||||
map(char('-'), |_| Operator::Minus),
|
map(char('-'), |_| Operator::Minus),
|
||||||
map(char('*'), |_| Operator::Star),
|
map(char('*'), |_| Operator::Star),
|
||||||
map(char('/'), |_| Operator::Slash),
|
map(char('/'), |_| Operator::Slash),
|
||||||
|
map(char('<'), |_| Operator::LessThan),
|
||||||
|
map(char('>'), |_| Operator::GreaterThan),
|
||||||
|
map(string("<="), |_| Operator::LessThanOrEq),
|
||||||
|
map(string(">="), |_| Operator::GreaterThanOrEq),
|
||||||
|
map(char('^'), |_| Operator::Caret),
|
||||||
|
map(char('%'), |_| Operator::Percent),
|
||||||
|
map(string("//"), |_| Operator::DoubleSlash),
|
||||||
|
map(string("%%"), |_| Operator::DoublePercent),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -929,6 +929,224 @@ where
|
||||||
one_of2(p1, one_of9(p2, p3, p4, p5, p6, p7, p8, p9, p10))
|
one_of2(p1, one_of9(p2, p3, p4, p5, p6, p7, p8, p9, p10))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn one_of11<'a, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, A>(
|
||||||
|
p1: P1,
|
||||||
|
p2: P2,
|
||||||
|
p3: P3,
|
||||||
|
p4: P4,
|
||||||
|
p5: P5,
|
||||||
|
p6: P6,
|
||||||
|
p7: P7,
|
||||||
|
p8: P8,
|
||||||
|
p9: P9,
|
||||||
|
p10: P10,
|
||||||
|
p11: P11,
|
||||||
|
) -> impl Parser<'a, A>
|
||||||
|
where
|
||||||
|
P1: Parser<'a, A>,
|
||||||
|
P2: Parser<'a, A>,
|
||||||
|
P3: Parser<'a, A>,
|
||||||
|
P4: Parser<'a, A>,
|
||||||
|
P5: Parser<'a, A>,
|
||||||
|
P6: Parser<'a, A>,
|
||||||
|
P7: Parser<'a, A>,
|
||||||
|
P8: Parser<'a, A>,
|
||||||
|
P9: Parser<'a, A>,
|
||||||
|
P10: Parser<'a, A>,
|
||||||
|
P11: Parser<'a, A>,
|
||||||
|
{
|
||||||
|
one_of2(p1, one_of10(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn one_of12<'a, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, A>(
|
||||||
|
p1: P1,
|
||||||
|
p2: P2,
|
||||||
|
p3: P3,
|
||||||
|
p4: P4,
|
||||||
|
p5: P5,
|
||||||
|
p6: P6,
|
||||||
|
p7: P7,
|
||||||
|
p8: P8,
|
||||||
|
p9: P9,
|
||||||
|
p10: P10,
|
||||||
|
p11: P11,
|
||||||
|
p12: P12,
|
||||||
|
) -> impl Parser<'a, A>
|
||||||
|
where
|
||||||
|
P1: Parser<'a, A>,
|
||||||
|
P2: Parser<'a, A>,
|
||||||
|
P3: Parser<'a, A>,
|
||||||
|
P4: Parser<'a, A>,
|
||||||
|
P5: Parser<'a, A>,
|
||||||
|
P6: Parser<'a, A>,
|
||||||
|
P7: Parser<'a, A>,
|
||||||
|
P8: Parser<'a, A>,
|
||||||
|
P9: Parser<'a, A>,
|
||||||
|
P10: Parser<'a, A>,
|
||||||
|
P11: Parser<'a, A>,
|
||||||
|
P12: Parser<'a, A>,
|
||||||
|
{
|
||||||
|
one_of2(p1, one_of11(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn one_of13<'a, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, A>(
|
||||||
|
p1: P1,
|
||||||
|
p2: P2,
|
||||||
|
p3: P3,
|
||||||
|
p4: P4,
|
||||||
|
p5: P5,
|
||||||
|
p6: P6,
|
||||||
|
p7: P7,
|
||||||
|
p8: P8,
|
||||||
|
p9: P9,
|
||||||
|
p10: P10,
|
||||||
|
p11: P11,
|
||||||
|
p12: P12,
|
||||||
|
p13: P13,
|
||||||
|
) -> impl Parser<'a, A>
|
||||||
|
where
|
||||||
|
P1: Parser<'a, A>,
|
||||||
|
P2: Parser<'a, A>,
|
||||||
|
P3: Parser<'a, A>,
|
||||||
|
P4: Parser<'a, A>,
|
||||||
|
P5: Parser<'a, A>,
|
||||||
|
P6: Parser<'a, A>,
|
||||||
|
P7: Parser<'a, A>,
|
||||||
|
P8: Parser<'a, A>,
|
||||||
|
P9: Parser<'a, A>,
|
||||||
|
P10: Parser<'a, A>,
|
||||||
|
P11: Parser<'a, A>,
|
||||||
|
P12: Parser<'a, A>,
|
||||||
|
P13: Parser<'a, A>,
|
||||||
|
{
|
||||||
|
one_of2(
|
||||||
|
p1,
|
||||||
|
one_of12(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn one_of14<'a, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, A>(
|
||||||
|
p1: P1,
|
||||||
|
p2: P2,
|
||||||
|
p3: P3,
|
||||||
|
p4: P4,
|
||||||
|
p5: P5,
|
||||||
|
p6: P6,
|
||||||
|
p7: P7,
|
||||||
|
p8: P8,
|
||||||
|
p9: P9,
|
||||||
|
p10: P10,
|
||||||
|
p11: P11,
|
||||||
|
p12: P12,
|
||||||
|
p13: P13,
|
||||||
|
p14: P14,
|
||||||
|
) -> impl Parser<'a, A>
|
||||||
|
where
|
||||||
|
P1: Parser<'a, A>,
|
||||||
|
P2: Parser<'a, A>,
|
||||||
|
P3: Parser<'a, A>,
|
||||||
|
P4: Parser<'a, A>,
|
||||||
|
P5: Parser<'a, A>,
|
||||||
|
P6: Parser<'a, A>,
|
||||||
|
P7: Parser<'a, A>,
|
||||||
|
P8: Parser<'a, A>,
|
||||||
|
P9: Parser<'a, A>,
|
||||||
|
P10: Parser<'a, A>,
|
||||||
|
P11: Parser<'a, A>,
|
||||||
|
P12: Parser<'a, A>,
|
||||||
|
P13: Parser<'a, A>,
|
||||||
|
P14: Parser<'a, A>,
|
||||||
|
{
|
||||||
|
one_of2(
|
||||||
|
p1,
|
||||||
|
one_of13(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn one_of15<'a, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, A>(
|
||||||
|
p1: P1,
|
||||||
|
p2: P2,
|
||||||
|
p3: P3,
|
||||||
|
p4: P4,
|
||||||
|
p5: P5,
|
||||||
|
p6: P6,
|
||||||
|
p7: P7,
|
||||||
|
p8: P8,
|
||||||
|
p9: P9,
|
||||||
|
p10: P10,
|
||||||
|
p11: P11,
|
||||||
|
p12: P12,
|
||||||
|
p13: P13,
|
||||||
|
p14: P14,
|
||||||
|
p15: P15,
|
||||||
|
) -> impl Parser<'a, A>
|
||||||
|
where
|
||||||
|
P1: Parser<'a, A>,
|
||||||
|
P2: Parser<'a, A>,
|
||||||
|
P3: Parser<'a, A>,
|
||||||
|
P4: Parser<'a, A>,
|
||||||
|
P5: Parser<'a, A>,
|
||||||
|
P6: Parser<'a, A>,
|
||||||
|
P7: Parser<'a, A>,
|
||||||
|
P8: Parser<'a, A>,
|
||||||
|
P9: Parser<'a, A>,
|
||||||
|
P10: Parser<'a, A>,
|
||||||
|
P11: Parser<'a, A>,
|
||||||
|
P12: Parser<'a, A>,
|
||||||
|
P13: Parser<'a, A>,
|
||||||
|
P14: Parser<'a, A>,
|
||||||
|
P15: Parser<'a, A>,
|
||||||
|
{
|
||||||
|
one_of2(
|
||||||
|
p1,
|
||||||
|
one_of14(p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn one_of16<'a, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, A>(
|
||||||
|
p1: P1,
|
||||||
|
p2: P2,
|
||||||
|
p3: P3,
|
||||||
|
p4: P4,
|
||||||
|
p5: P5,
|
||||||
|
p6: P6,
|
||||||
|
p7: P7,
|
||||||
|
p8: P8,
|
||||||
|
p9: P9,
|
||||||
|
p10: P10,
|
||||||
|
p11: P11,
|
||||||
|
p12: P12,
|
||||||
|
p13: P13,
|
||||||
|
p14: P14,
|
||||||
|
p15: P15,
|
||||||
|
p16: P16,
|
||||||
|
) -> impl Parser<'a, A>
|
||||||
|
where
|
||||||
|
P1: Parser<'a, A>,
|
||||||
|
P2: Parser<'a, A>,
|
||||||
|
P3: Parser<'a, A>,
|
||||||
|
P4: Parser<'a, A>,
|
||||||
|
P5: Parser<'a, A>,
|
||||||
|
P6: Parser<'a, A>,
|
||||||
|
P7: Parser<'a, A>,
|
||||||
|
P8: Parser<'a, A>,
|
||||||
|
P9: Parser<'a, A>,
|
||||||
|
P10: Parser<'a, A>,
|
||||||
|
P11: Parser<'a, A>,
|
||||||
|
P12: Parser<'a, A>,
|
||||||
|
P13: Parser<'a, A>,
|
||||||
|
P14: Parser<'a, A>,
|
||||||
|
P15: Parser<'a, A>,
|
||||||
|
P16: Parser<'a, A>,
|
||||||
|
{
|
||||||
|
one_of2(
|
||||||
|
p1,
|
||||||
|
one_of15(
|
||||||
|
p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// DEBUG COMBINATORS
|
// DEBUG COMBINATORS
|
||||||
//
|
//
|
||||||
// These use dyn for runtime dynamic dispatch. It prevents combinatoric
|
// These use dyn for runtime dynamic dispatch. It prevents combinatoric
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue