Require Expr::parse() callers to supply Level

This commit is contained in:
Dirkjan Ochtman 2023-09-28 15:22:58 +02:00
parent 5718175291
commit 36f4442978
2 changed files with 18 additions and 16 deletions

View File

@ -76,17 +76,13 @@ impl<'a> Expr<'a> {
preceded( preceded(
ws(char('(')), ws(char('(')),
cut(terminated( cut(terminated(
separated_list0(char(','), ws(move |i| Self::nested(i, level))), separated_list0(char(','), ws(move |i| Self::parse(i, level))),
char(')'), char(')'),
)), )),
)(i) )(i)
} }
pub(super) fn parse(i: &'a str) -> IResult<&'a str, Self> { pub(super) fn parse(i: &'a str, level: Level) -> IResult<&'a str, Self> {
Self::nested(i, Level::default())
}
fn nested(i: &'a str, level: Level) -> IResult<&'a str, Self> {
let level = level.nest(i)?; let level = level.nest(i)?;
let range_right = move |i| { let range_right = move |i| {
pair( pair(
@ -172,7 +168,7 @@ impl<'a> Expr<'a> {
fn group(i: &'a str, level: Level) -> IResult<&'a str, Self> { fn group(i: &'a str, level: Level) -> IResult<&'a str, Self> {
let level = level.nest(i)?; let level = level.nest(i)?;
let (i, expr) = preceded(ws(char('(')), opt(|i| Self::nested(i, level)))(i)?; let (i, expr) = preceded(ws(char('(')), opt(|i| Self::parse(i, level)))(i)?;
let expr = match expr { let expr = match expr {
Some(expr) => expr, Some(expr) => expr,
None => { None => {
@ -189,7 +185,7 @@ impl<'a> Expr<'a> {
let mut exprs = vec![expr]; let mut exprs = vec![expr];
let (i, _) = fold_many0( let (i, _) = fold_many0(
preceded(char(','), ws(|i| Self::nested(i, level))), preceded(char(','), ws(|i| Self::parse(i, level))),
|| (), || (),
|_, expr| { |_, expr| {
exprs.push(expr); exprs.push(expr);
@ -205,7 +201,7 @@ impl<'a> Expr<'a> {
ws(char('[')), ws(char('[')),
cut(terminated( cut(terminated(
map( map(
separated_list0(char(','), ws(move |i| Self::nested(i, level))), separated_list0(char(','), ws(move |i| Self::parse(i, level))),
Self::Array, Self::Array,
), ),
char(']'), char(']'),
@ -348,7 +344,7 @@ impl<'a> Suffix<'a> {
map( map(
preceded( preceded(
ws(char('[')), ws(char('[')),
cut(terminated(ws(move |i| Expr::nested(i, level)), char(']'))), cut(terminated(ws(move |i| Expr::parse(i, level)), char(']'))),
), ),
Self::Index, Self::Index,
)(i) )(i)

View File

@ -101,7 +101,7 @@ impl<'a> Node<'a> {
|i| s.tag_expr_start(i), |i| s.tag_expr_start(i),
cut(tuple(( cut(tuple((
opt(Whitespace::parse), opt(Whitespace::parse),
ws(Expr::parse), ws(|i| Expr::parse(i, Level::default())),
opt(Whitespace::parse), opt(Whitespace::parse),
|i| s.tag_expr_end(i), |i| s.tag_expr_end(i),
))), ))),
@ -325,7 +325,7 @@ impl<'a> CondTest<'a> {
ws(Target::parse), ws(Target::parse),
ws(char('=')), ws(char('=')),
)), )),
ws(Expr::parse), ws(|i| Expr::parse(i, Level::default())),
))), ))),
); );
let (i, (target, expr)) = p(i)?; let (i, (target, expr)) = p(i)?;
@ -371,7 +371,10 @@ impl<'a> Loop<'a> {
result result
} }
let if_cond = preceded(ws(keyword("if")), cut(ws(Expr::parse))); let if_cond = preceded(
ws(keyword("if")),
cut(ws(|i| Expr::parse(i, Level::default()))),
);
let else_block = |i| { let else_block = |i| {
let mut p = preceded( let mut p = preceded(
ws(keyword("else")), ws(keyword("else")),
@ -395,7 +398,7 @@ impl<'a> Loop<'a> {
ws(Target::parse), ws(Target::parse),
ws(keyword("in")), ws(keyword("in")),
cut(tuple(( cut(tuple((
ws(Expr::parse), ws(|i| Expr::parse(i, Level::default())),
opt(if_cond), opt(if_cond),
opt(Whitespace::parse), opt(Whitespace::parse),
|i| s.tag_block_end(i), |i| s.tag_block_end(i),
@ -570,7 +573,7 @@ impl<'a> Match<'a> {
opt(Whitespace::parse), opt(Whitespace::parse),
ws(keyword("match")), ws(keyword("match")),
cut(tuple(( cut(tuple((
ws(Expr::parse), ws(|i| Expr::parse(i, Level::default())),
opt(Whitespace::parse), opt(Whitespace::parse),
|i| s.tag_block_end(i), |i| s.tag_block_end(i),
cut(tuple(( cut(tuple((
@ -738,7 +741,10 @@ impl<'a> Let<'a> {
ws(alt((keyword("let"), keyword("set")))), ws(alt((keyword("let"), keyword("set")))),
cut(tuple(( cut(tuple((
ws(Target::parse), ws(Target::parse),
opt(preceded(ws(char('=')), ws(Expr::parse))), opt(preceded(
ws(char('=')),
ws(|i| Expr::parse(i, Level::default())),
)),
opt(Whitespace::parse), opt(Whitespace::parse),
))), ))),
)); ));