diff options
author | Vincent Ambo <mail@tazj.in> | 2020-12-31T14·59+0300 |
---|---|---|
committer | tazjin <mail@tazj.in> | 2020-12-31T15·33+0000 |
commit | 3c979acdf367ea18ec2248bbe8e0befa15966bb4 (patch) | |
tree | 2878c92786c4462164b24065c200354944ff6468 /users/tazjin/rlox/src/parser.rs | |
parent | 26ed836e1d12ce7a3205bdfbe20e4e5a59f5062b (diff) |
refactor(tazjin/rlox): Unify parser::Statement & parser::Declaration r/2036
Change-Id: I6f21b246eb9d3bf760edb3220ce6be5de5b05b08 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2302 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
Diffstat (limited to 'users/tazjin/rlox/src/parser.rs')
-rw-r--r-- | users/tazjin/rlox/src/parser.rs | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/users/tazjin/rlox/src/parser.rs b/users/tazjin/rlox/src/parser.rs index b46e570994c4..1a271fd0ae2a 100644 --- a/users/tazjin/rlox/src/parser.rs +++ b/users/tazjin/rlox/src/parser.rs @@ -54,13 +54,8 @@ pub enum Expr<'a> { Variable(Variable<'a>), } -#[derive(Debug)] -pub enum Statement<'a> { - Expr(Expr<'a>), - Print(Expr<'a>), -} - -// Not to be confused with `Variable`, which is for access. +// Variable assignment. Not to be confused with `Variable`, which is +// for access. #[derive(Debug)] pub struct Var<'a> { pub name: Token<'a>, @@ -68,12 +63,13 @@ pub struct Var<'a> { } #[derive(Debug)] -pub enum Declaration<'a> { - Stmt(Statement<'a>), +pub enum Statement<'a> { + Expr(Expr<'a>), + Print(Expr<'a>), Var(Var<'a>), } -pub type Program<'a> = Vec<Declaration<'a>>; +pub type Program<'a> = Vec<Statement<'a>>; // Parser @@ -109,20 +105,19 @@ struct Parser<'a> { type ExprResult<'a> = Result<Expr<'a>, Error>; type StmtResult<'a> = Result<Statement<'a>, Error>; -type DeclResult<'a> = Result<Declaration<'a>, Error>; impl<'a> Parser<'a> { // recursive-descent parser functions - fn declaration(&mut self) -> DeclResult<'a> { + fn declaration(&mut self) -> StmtResult<'a> { if self.match_token(&[TokenKind::Var]) { return self.var_declaration(); } - Ok(Declaration::Stmt(self.statement()?)) + self.statement() } - fn var_declaration(&mut self) -> DeclResult<'a> { + fn var_declaration(&mut self) -> StmtResult<'a> { // Since `TokenKind::Identifier` carries data, we can't use // `consume`. if let TokenKind::Identifier(_) = self.peek().kind { @@ -136,7 +131,7 @@ impl<'a> Parser<'a> { } self.consume(&TokenKind::Semicolon, ErrorKind::ExpectedSemicolon)?; - return Ok(Declaration::Var(var)); + return Ok(Statement::Var(var)); } return Err(Error { |