Fix parser for index and call exprs, remove old test that didn't work, add visitor pattern

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-09-03 18:32:22 -07:00
parent 2fd340a688
commit f8819279f8
6 changed files with 325 additions and 65 deletions

View File

@@ -19,6 +19,7 @@ Body -> Result<Vec<Stmt>>:
Stmt -> Result<Stmt>:
Expr { Ok(Stmt::Expr($1?)) }
//| Assign { todo!() }
;
Expr -> Result<Expr>: BinExpr { $1 };
@@ -42,31 +43,24 @@ BinExpr -> Result<Expr>:
UnExpr -> Result<Expr>:
'+' UnExpr { Ok(UnExpr::new_expr(UnOp::Plus, $2?)) }
| '-' UnExpr { Ok(UnExpr::new_expr(UnOp::Minus, $2?)) }
| CallIndexExpr { $1 }
;
// TODO - add CallExpr and IndexExpr, allow them to nest
// - UnExpr will point to CallIndexExpr
// - Call/Index exprs are based on an AccessExpr
// - AccessExpr will retain ExprTrailing in between its items, but should end in a .ident
CallIndexExpr -> Result<Expr>:
IndexExpr { $1 }
| CallExpr { $1 }
| AccessExpr { $1 }
;
AccessExpr -> Result<Expr>:
AtomExpr AccessExprTail {
Ok(AccessExpr::new_expr($1?, $2?))
CallExpr -> Result<Expr>:
CallIndexExpr '(' FunArgs ')' {
Ok(CallExpr::new_expr($1?, $3?))
}
| AtomExpr {
Ok(AccessExpr::new_expr($1?, Default::default()))
}
;
AccessExprTail -> Result<Vec<Access>>:
AccessExprTail '.' Ident ExprTrailing {
flatten($1, Ok(Access { access: $3?, trailing: $4? }))
}
| '.' Ident ExprTrailing {
Ok(vec![Access { access: $2?, trailing: $3? }])
}
;
ExprTrailing -> Result<Vec<ExprTrail>>:
ExprTrailing '(' FunArgs ')' { flatten($1, Ok(ExprTrail::Call($3?))) }
| ExprTrailing '[' Expr ']' { flatten($1, Ok(ExprTrail::Index($3?))) }
| { Ok(Vec::new()) }
;
FunArgs -> Result<Vec<Expr>>:
@@ -79,6 +73,17 @@ FunArgsTail -> Result<Vec<Expr>>:
| Expr { Ok(vec![$1?]) }
;
IndexExpr -> Result<Expr>:
CallIndexExpr '[' Expr ']' {
Ok(IndexExpr::new_expr($1?, $3?))
}
;
AccessExpr -> Result<Expr>:
AtomExpr { $1 }
| CallIndexExpr '.' Ident { Ok(AccessExpr::new_expr($1?, $3?)) }
;
AtomExpr -> Result<Expr>:
Atom { $1.map(Expr::Atom) }
| '(' Expr ')' { $2 }