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:
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user