Converted all parser methods to use the annotation

This commit is contained in:
greg 2018-10-19 02:56:11 -07:00
parent 3b20b40eb7
commit 6219a06d6f
1 changed files with 162 additions and 135 deletions

View File

@ -83,32 +83,6 @@ macro_rules! expect {
} }
} }
macro_rules! parse_method {
($name:ident(&mut $self:ident) -> $type:ty $body:block) => {
fn $name(&mut $self) -> $type {
let next_token = $self.peek_with_token_offset();
let record = ParseRecord {
production_name: stringify!($name).to_string(),
next_token: format!("{}", next_token.to_string_with_metadata()),
level: $self.parse_level,
};
$self.parse_level += 1;
$self.parse_record.push(record);
let result = { $body };
if $self.parse_level != 0 {
$self.parse_level -= 1;
}
match result {
Err(ParseError { token: None, msg }) =>
Err(ParseError { token: Some(next_token), msg }),
_ => result
}
}
};
}
macro_rules! delimited { macro_rules! delimited {
($self:expr, $start:pat, $parse_fn:ident, $( $delim:pat )|+, $end:pat, nonstrict) => { ($self:expr, $start:pat, $parse_fn:ident, $( $delim:pat )|+, $end:pat, nonstrict) => {
delimited!($self, $start, $parse_fn, $( $delim )|*, $end, false) delimited!($self, $start, $parse_fn, $( $delim )|*, $end, false)
@ -266,7 +240,8 @@ enumerator := identifier '<-' expression | identifier '=' expression //TODO add
*/ */
impl Parser { impl Parser {
parse_method!(program(&mut self) -> ParseResult<AST> { #[recursive_descent_method]
fn program(&mut self) -> ParseResult<AST> {
let mut statements = Vec::new(); let mut statements = Vec::new();
loop { loop {
match self.peek() { match self.peek() {
@ -279,9 +254,10 @@ impl Parser {
} }
} }
Ok(AST(statements)) Ok(AST(statements))
}); }
parse_method!(statement(&mut self) -> ParseResult<Statement> { #[recursive_descent_method]
fn statement(&mut self) -> ParseResult<Statement> {
//TODO handle error recovery here //TODO handle error recovery here
match self.peek() { match self.peek() {
Keyword(Type) => self.type_declaration().map(|decl| { Statement::Declaration(decl) }), Keyword(Type) => self.type_declaration().map(|decl| { Statement::Declaration(decl) }),
@ -291,14 +267,16 @@ impl Parser {
Keyword(Impl) => self.impl_declaration().map(|decl| Statement::Declaration(decl)), Keyword(Impl) => self.impl_declaration().map(|decl| Statement::Declaration(decl)),
_ => self.expression().map(|expr| { Statement::ExpressionStatement(expr) } ), _ => self.expression().map(|expr| { Statement::ExpressionStatement(expr) } ),
} }
}); }
parse_method!(type_declaration(&mut self) -> ParseResult<Declaration> { #[recursive_descent_method]
fn type_declaration(&mut self) -> ParseResult<Declaration> {
expect!(self, Keyword(Type)); expect!(self, Keyword(Type));
self.type_declaration_body() self.type_declaration_body()
}); }
parse_method!(type_declaration_body(&mut self) -> ParseResult<Declaration> { #[recursive_descent_method]
fn type_declaration_body(&mut self) -> ParseResult<Declaration> {
if let Keyword(Alias) = self.peek() { if let Keyword(Alias) = self.peek() {
self.type_alias() self.type_alias()
} else { } else {
@ -313,17 +291,19 @@ impl Parser {
let body = self.type_body()?; let body = self.type_body()?;
Ok(Declaration::TypeDecl { name, body, mutable}) Ok(Declaration::TypeDecl { name, body, mutable})
} }
}); }
parse_method!(type_alias(&mut self) -> ParseResult<Declaration> { #[recursive_descent_method]
fn type_alias(&mut self) -> ParseResult<Declaration> {
expect!(self, Keyword(Alias)); expect!(self, Keyword(Alias));
let alias = self.identifier()?; let alias = self.identifier()?;
expect!(self, Operator(ref c) if **c == "="); expect!(self, Operator(ref c) if **c == "=");
let original = self.identifier()?; let original = self.identifier()?;
Ok(Declaration::TypeAlias(alias, original)) Ok(Declaration::TypeAlias(alias, original))
}); }
parse_method!(type_body(&mut self) -> ParseResult<TypeBody> { #[recursive_descent_method]
fn type_body(&mut self) -> ParseResult<TypeBody> {
let mut variants = Vec::new(); let mut variants = Vec::new();
variants.push(self.variant_specifier()?); variants.push(self.variant_specifier()?);
loop { loop {
@ -335,9 +315,10 @@ impl Parser {
} }
} }
Ok(TypeBody(variants)) Ok(TypeBody(variants))
}); }
parse_method!(variant_specifier(&mut self) -> ParseResult<Variant> { #[recursive_descent_method]
fn variant_specifier(&mut self) -> ParseResult<Variant> {
use self::Variant::*; use self::Variant::*;
let name = self.identifier()?; let name = self.identifier()?;
@ -352,16 +333,18 @@ impl Parser {
}, },
_ => Ok(UnitStruct(name)) _ => Ok(UnitStruct(name))
} }
}); }
parse_method!(typed_identifier(&mut self) -> ParseResult<(Rc<String>, TypeIdentifier)> { #[recursive_descent_method]
fn typed_identifier(&mut self) -> ParseResult<(Rc<String>, TypeIdentifier)> {
let identifier = self.identifier()?; let identifier = self.identifier()?;
expect!(self, Colon); expect!(self, Colon);
let type_name = self.type_name()?; let type_name = self.type_name()?;
Ok((identifier, type_name)) Ok((identifier, type_name))
}); }
parse_method!(func_declaration(&mut self) -> ParseResult<Declaration> { #[recursive_descent_method]
fn func_declaration(&mut self) -> ParseResult<Declaration> {
let signature = self.func_signature()?; let signature = self.func_signature()?;
if let LCurlyBrace = self.peek() { if let LCurlyBrace = self.peek() {
let statements = delimited!(self, LCurlyBrace, statement, Newline | Semicolon, RCurlyBrace, nonstrict); let statements = delimited!(self, LCurlyBrace, statement, Newline | Semicolon, RCurlyBrace, nonstrict);
@ -369,9 +352,10 @@ impl Parser {
} else { } else {
Ok(Declaration::FuncSig(signature)) Ok(Declaration::FuncSig(signature))
} }
}); }
parse_method!(func_signature(&mut self) -> ParseResult<Signature> { #[recursive_descent_method]
fn func_signature(&mut self) -> ParseResult<Signature> {
expect!(self, Keyword(Func)); expect!(self, Keyword(Func));
let (name, operator) = match self.peek() { let (name, operator) = match self.peek() {
Operator(s) => { Operator(s) => {
@ -387,19 +371,20 @@ impl Parser {
_ => None, _ => None,
}; };
Ok(Signature { name, operator, params, type_anno }) Ok(Signature { name, operator, params, type_anno })
}); }
parse_method!(formal_param(&mut self) -> ParseResult<FormalParam> { #[recursive_descent_method]
fn formal_param(&mut self) -> ParseResult<FormalParam> {
let name = self.identifier()?; let name = self.identifier()?;
let ty = match self.peek() { let ty = match self.peek() {
Colon => Some(self.type_anno()?), Colon => Some(self.type_anno()?),
_ => None _ => None
}; };
Ok((name, ty)) Ok((name, ty))
}); }
parse_method!(binding_declaration(&mut self) -> ParseResult<Declaration> {
#[recursive_descent_method]
fn binding_declaration(&mut self) -> ParseResult<Declaration> {
expect!(self, Keyword(Kw::Let)); expect!(self, Keyword(Kw::Let));
let constant = match self.peek() { let constant = match self.peek() {
Keyword(Kw::Mut) => { Keyword(Kw::Mut) => {
@ -413,20 +398,23 @@ impl Parser {
let expr = self.expression()?; let expr = self.expression()?;
Ok(Declaration::Binding { name, constant, expr }) Ok(Declaration::Binding { name, constant, expr })
}); }
parse_method!(interface_declaration(&mut self) -> ParseResult<Declaration> { #[recursive_descent_method]
fn interface_declaration(&mut self) -> ParseResult<Declaration> {
expect!(self, Keyword(Interface)); expect!(self, Keyword(Interface));
let name = self.identifier()?; let name = self.identifier()?;
let signatures = self.signature_block()?; let signatures = self.signature_block()?;
Ok(Declaration::Interface { name, signatures }) Ok(Declaration::Interface { name, signatures })
}); }
parse_method!(signature_block(&mut self) -> ParseResult<Vec<Signature>> { #[recursive_descent_method]
fn signature_block(&mut self) -> ParseResult<Vec<Signature>> {
Ok(delimited!(self, LCurlyBrace, func_signature, Newline | Semicolon, RCurlyBrace, nonstrict)) Ok(delimited!(self, LCurlyBrace, func_signature, Newline | Semicolon, RCurlyBrace, nonstrict))
}); }
parse_method!(impl_declaration(&mut self) -> ParseResult<Declaration> { #[recursive_descent_method]
fn impl_declaration(&mut self) -> ParseResult<Declaration> {
expect!(self, Keyword(Impl)); expect!(self, Keyword(Impl));
let first = self.type_name()?; let first = self.type_name()?;
let second = if let Keyword(For) = self.peek() { let second = if let Keyword(For) = self.peek() {
@ -449,13 +437,15 @@ impl Parser {
(first, None) => Declaration::Impl { type_name: first, interface_name: None, block } (first, None) => Declaration::Impl { type_name: first, interface_name: None, block }
}; };
Ok(result) Ok(result)
}); }
parse_method!(decl_block(&mut self) -> ParseResult<Vec<Declaration>> { #[recursive_descent_method]
fn decl_block(&mut self) -> ParseResult<Vec<Declaration>> {
Ok(delimited!(self, LCurlyBrace, func_declaration, Newline | Semicolon, RCurlyBrace, nonstrict)) Ok(delimited!(self, LCurlyBrace, func_declaration, Newline | Semicolon, RCurlyBrace, nonstrict))
}); }
parse_method!(expression(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn expression(&mut self) -> ParseResult<Expression> {
let mut expr_body = self.precedence_expr(BinOp::min_precedence())?; let mut expr_body = self.precedence_expr(BinOp::min_precedence())?;
let type_anno = match self.peek() { let type_anno = match self.peek() {
Colon => Some(self.type_anno()?), Colon => Some(self.type_anno()?),
@ -466,22 +456,25 @@ impl Parser {
} }
expr_body.1 = type_anno; expr_body.1 = type_anno;
Ok(expr_body) Ok(expr_body)
}); }
parse_method!(type_anno(&mut self) -> ParseResult<TypeIdentifier> { #[recursive_descent_method]
fn type_anno(&mut self) -> ParseResult<TypeIdentifier> {
expect!(self, Colon); expect!(self, Colon);
self.type_name() self.type_name()
}); }
parse_method!(type_name(&mut self) -> ParseResult<TypeIdentifier> { #[recursive_descent_method]
fn type_name(&mut self) -> ParseResult<TypeIdentifier> {
use self::TypeIdentifier::*; use self::TypeIdentifier::*;
Ok(match self.peek() { Ok(match self.peek() {
LParen => Tuple(delimited!(self, LParen, type_name, Comma, RParen)), LParen => Tuple(delimited!(self, LParen, type_name, Comma, RParen)),
_ => Singleton(self.type_singleton_name()?), _ => Singleton(self.type_singleton_name()?),
}) })
}); }
parse_method!(type_singleton_name(&mut self) -> ParseResult<TypeSingletonName> { #[recursive_descent_method]
fn type_singleton_name(&mut self) -> ParseResult<TypeSingletonName> {
Ok(TypeSingletonName { Ok(TypeSingletonName {
name: self.identifier()?, name: self.identifier()?,
params: match self.peek() { params: match self.peek() {
@ -489,7 +482,7 @@ impl Parser {
_ => vec![], _ => vec![],
} }
}) })
}); }
// this implements Pratt parsing, see http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/ // this implements Pratt parsing, see http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
fn precedence_expr(&mut self, precedence: i32) -> ParseResult<Expression> { fn precedence_expr(&mut self, precedence: i32) -> ParseResult<Expression> {
@ -522,7 +515,8 @@ impl Parser {
Ok(lhs) Ok(lhs)
} }
parse_method!(prefix_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn prefix_expr(&mut self) -> ParseResult<Expression> {
match self.peek() { match self.peek() {
Operator(ref op) if PrefixOp::is_prefix(&*op) => { Operator(ref op) if PrefixOp::is_prefix(&*op) => {
let sigil = match self.next() { let sigil = match self.next() {
@ -536,9 +530,10 @@ impl Parser {
}, },
_ => self.call_expr() _ => self.call_expr()
} }
}); }
parse_method!(call_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn call_expr(&mut self) -> ParseResult<Expression> {
let index = self.index_expr()?; let index = self.index_expr()?;
Ok(if let LParen = self.peek() { Ok(if let LParen = self.peek() {
let arguments = delimited!(self, LParen, expression, Comma, RParen); let arguments = delimited!(self, LParen, expression, Comma, RParen);
@ -546,9 +541,10 @@ impl Parser {
} else { } else {
index index
}) })
}); }
parse_method!(index_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn index_expr(&mut self) -> ParseResult<Expression> {
let primary = self.primary()?; let primary = self.primary()?;
Ok(if let LSquareBracket = self.peek() { Ok(if let LSquareBracket = self.peek() {
let indexers = delimited!(self, LSquareBracket, expression, Comma, RSquareBracket); let indexers = delimited!(self, LSquareBracket, expression, Comma, RSquareBracket);
@ -559,9 +555,10 @@ impl Parser {
} else { } else {
primary primary
}) })
}); }
parse_method!(primary(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn primary(&mut self) -> ParseResult<Expression> {
match self.peek() { match self.peek() {
LCurlyBrace => self.curly_brace_expr(), LCurlyBrace => self.curly_brace_expr(),
LParen => self.paren_expr(), LParen => self.paren_expr(),
@ -572,18 +569,21 @@ impl Parser {
Identifier(_) => self.identifier_expr(), Identifier(_) => self.identifier_expr(),
_ => self.literal(), _ => self.literal(),
} }
}); }
parse_method!(list_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn list_expr(&mut self) -> ParseResult<Expression> {
let exprs = delimited!(self, LSquareBracket, expression, Comma, RSquareBracket); let exprs = delimited!(self, LSquareBracket, expression, Comma, RSquareBracket);
Ok(Expression(ExpressionType::ListLiteral(exprs), None)) Ok(Expression(ExpressionType::ListLiteral(exprs), None))
}); }
parse_method!(curly_brace_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn curly_brace_expr(&mut self) -> ParseResult<Expression> {
self.lambda_expr() self.lambda_expr()
}); }
parse_method!(lambda_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn lambda_expr(&mut self) -> ParseResult<Expression> {
expect!(self, LCurlyBrace); expect!(self, LCurlyBrace);
let params = delimited!(self, Pipe, formal_param, Comma, Pipe); let params = delimited!(self, Pipe, formal_param, Comma, Pipe);
let mut body = Vec::new(); let mut body = Vec::new();
@ -599,9 +599,10 @@ impl Parser {
} }
expect!(self, RCurlyBrace); expect!(self, RCurlyBrace);
Ok(Expression(ExpressionType::Lambda { params, body }, None)) //TODO need to handle types somehow Ok(Expression(ExpressionType::Lambda { params, body }, None)) //TODO need to handle types somehow
}); }
parse_method!(paren_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn paren_expr(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
let old_struct_value = self.restrictions.no_struct_literal; let old_struct_value = self.restrictions.no_struct_literal;
self.restrictions.no_struct_literal = false; self.restrictions.no_struct_literal = false;
@ -615,9 +616,10 @@ impl Parser {
}; };
self.restrictions.no_struct_literal = old_struct_value; self.restrictions.no_struct_literal = old_struct_value;
output output
}); }
parse_method!(identifier_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn identifier_expr(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
let identifier = self.identifier()?; let identifier = self.identifier()?;
Ok(match self.peek() { Ok(match self.peek() {
@ -627,20 +629,23 @@ impl Parser {
}, },
_ => Expression(Value(identifier), None) _ => Expression(Value(identifier), None)
}) })
}); }
parse_method!(record_block(&mut self) -> ParseResult<Vec<(Rc<String>, Expression)>> { #[recursive_descent_method]
fn record_block(&mut self) -> ParseResult<Vec<(Rc<String>, Expression)>> {
Ok(delimited!(self, LCurlyBrace, record_entry, Comma, RCurlyBrace)) Ok(delimited!(self, LCurlyBrace, record_entry, Comma, RCurlyBrace))
}); }
parse_method!(record_entry(&mut self) -> ParseResult<(Rc<String>, Expression)> { #[recursive_descent_method]
fn record_entry(&mut self) -> ParseResult<(Rc<String>, Expression)> {
let field_name = self.identifier()?; let field_name = self.identifier()?;
expect!(self, Colon); expect!(self, Colon);
let value = self.expression()?; let value = self.expression()?;
Ok((field_name, value)) Ok((field_name, value))
}); }
parse_method!(if_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn if_expr(&mut self) -> ParseResult<Expression> {
expect!(self, Keyword(Kw::If)); expect!(self, Keyword(Kw::If));
let discriminator = Box::new({ let discriminator = Box::new({
self.restrictions.no_struct_literal = true; self.restrictions.no_struct_literal = true;
@ -656,9 +661,10 @@ impl Parser {
}); });
Ok(Expression(ExpressionType::IfExpression { discriminator, body }, None)) Ok(Expression(ExpressionType::IfExpression { discriminator, body }, None))
}); }
parse_method!(discriminator(&mut self) -> ParseResult<Discriminator> { #[recursive_descent_method]
fn discriminator(&mut self) -> ParseResult<Discriminator> {
let lhs = self.prefix_expr()?; let lhs = self.prefix_expr()?;
let ref next = self.peek(); let ref next = self.peek();
Ok(if let Some(op) = BinOp::from_sigil_token(next) { Ok(if let Some(op) = BinOp::from_sigil_token(next) {
@ -666,34 +672,38 @@ impl Parser {
} else { } else {
Discriminator::Simple(lhs) Discriminator::Simple(lhs)
}) })
}); }
parse_method!(conditional(&mut self) -> ParseResult<IfExpressionBody> { #[recursive_descent_method]
fn conditional(&mut self) -> ParseResult<IfExpressionBody> {
expect!(self, Keyword(Kw::Then)); expect!(self, Keyword(Kw::Then));
let then_clause = self.expr_or_block()?; let then_clause = self.expr_or_block()?;
let else_clause = self.else_clause()?; let else_clause = self.else_clause()?;
Ok(IfExpressionBody::SimpleConditional(then_clause, else_clause)) Ok(IfExpressionBody::SimpleConditional(then_clause, else_clause))
}); }
parse_method!(simple_pattern_match(&mut self) -> ParseResult<IfExpressionBody> { #[recursive_descent_method]
fn simple_pattern_match(&mut self) -> ParseResult<IfExpressionBody> {
expect!(self, Keyword(Kw::Is)); expect!(self, Keyword(Kw::Is));
let pat = self.pattern()?; let pat = self.pattern()?;
expect!(self, Keyword(Kw::Then)); expect!(self, Keyword(Kw::Then));
let then_clause = self.expr_or_block()?; let then_clause = self.expr_or_block()?;
let else_clause = self.else_clause()?; let else_clause = self.else_clause()?;
Ok(IfExpressionBody::SimplePatternMatch(pat, then_clause, else_clause)) Ok(IfExpressionBody::SimplePatternMatch(pat, then_clause, else_clause))
}); }
parse_method!(else_clause(&mut self) -> ParseResult<Option<Block>> { #[recursive_descent_method]
fn else_clause(&mut self) -> ParseResult<Option<Block>> {
Ok(if let Keyword(Kw::Else) = self.peek() { Ok(if let Keyword(Kw::Else) = self.peek() {
self.next(); self.next();
Some(self.expr_or_block()?) Some(self.expr_or_block()?)
} else { } else {
None None
}) })
}); }
parse_method!(guard_block(&mut self) -> ParseResult<IfExpressionBody> { #[recursive_descent_method]
fn guard_block(&mut self) -> ParseResult<IfExpressionBody> {
//TODO - delimited! isn't sophisticated enough to do thisa //TODO - delimited! isn't sophisticated enough to do thisa
//let guards = delimited!(self, LCurlyBrace, guard_arm, Comma, RCurlyBrace); //let guards = delimited!(self, LCurlyBrace, guard_arm, Comma, RCurlyBrace);
expect!(self, LCurlyBrace); expect!(self, LCurlyBrace);
@ -714,16 +724,18 @@ impl Parser {
} }
expect!(self, RCurlyBrace); expect!(self, RCurlyBrace);
Ok(IfExpressionBody::GuardList(guards)) Ok(IfExpressionBody::GuardList(guards))
}); }
parse_method!(guard_arm(&mut self) -> ParseResult<GuardArm> { #[recursive_descent_method]
fn guard_arm(&mut self) -> ParseResult<GuardArm> {
let guard = self.guard()?; let guard = self.guard()?;
expect!(self, Operator(ref c) if **c == "->"); expect!(self, Operator(ref c) if **c == "->");
let body = self.expr_or_block()?; let body = self.expr_or_block()?;
Ok(GuardArm { guard, body }) Ok(GuardArm { guard, body })
}); }
parse_method!(guard(&mut self) -> ParseResult<Guard> { #[recursive_descent_method]
fn guard(&mut self) -> ParseResult<Guard> {
Ok(match self.peek() { Ok(match self.peek() {
Keyword(Kw::Is) => { Keyword(Kw::Is) => {
self.next(); self.next();
@ -740,18 +752,20 @@ impl Parser {
Guard::HalfExpr(HalfExpr { op: None, expr }) Guard::HalfExpr(HalfExpr { op: None, expr })
} }
}) })
}); }
parse_method!(pattern(&mut self) -> ParseResult<Pattern> { #[recursive_descent_method]
fn pattern(&mut self) -> ParseResult<Pattern> {
if let LParen = self.peek() { if let LParen = self.peek() {
let tuple_pattern_variants = delimited!(self, LParen, pattern, Comma, RParen); let tuple_pattern_variants = delimited!(self, LParen, pattern, Comma, RParen);
Ok(Pattern::TuplePattern(tuple_pattern_variants)) Ok(Pattern::TuplePattern(tuple_pattern_variants))
} else { } else {
self.simple_pattern() self.simple_pattern()
} }
}); }
parse_method!(simple_pattern(&mut self) -> ParseResult<Pattern> { #[recursive_descent_method]
fn simple_pattern(&mut self) -> ParseResult<Pattern> {
Ok(match self.peek() { Ok(match self.peek() {
Identifier(_) => { Identifier(_) => {
let id = self.identifier()?; let id = self.identifier()?;
@ -787,7 +801,7 @@ impl Parser {
}, },
other => return ParseError::new(&format!("{:?} is not a valid Pattern", other)) other => return ParseError::new(&format!("{:?} is not a valid Pattern", other))
}) })
}); }
#[recursive_descent_method] #[recursive_descent_method]
fn signed_number_literal(&mut self) -> ParseResult<Pattern> { fn signed_number_literal(&mut self) -> ParseResult<Pattern> {
@ -802,7 +816,8 @@ impl Parser {
Ok(Pattern::Literal(PatternLiteral::NumPattern { neg, num: expr_type })) Ok(Pattern::Literal(PatternLiteral::NumPattern { neg, num: expr_type }))
} }
parse_method!(record_pattern_entry(&mut self) -> ParseResult<(Rc<String>, Pattern)> { #[recursive_descent_method]
fn record_pattern_entry(&mut self) -> ParseResult<(Rc<String>, Pattern)> {
let name = self.identifier()?; let name = self.identifier()?;
Ok(match self.peek() { Ok(match self.peek() {
Colon => { Colon => {
@ -812,13 +827,15 @@ impl Parser {
}, },
_ => (name.clone(), Pattern::Literal(PatternLiteral::StringPattern(name.clone()))) _ => (name.clone(), Pattern::Literal(PatternLiteral::StringPattern(name.clone())))
}) })
}); }
parse_method!(block(&mut self) -> ParseResult<Block> { #[recursive_descent_method]
fn block(&mut self) -> ParseResult<Block> {
Ok(delimited!(self, LCurlyBrace, statement, Newline | Semicolon, RCurlyBrace, nonstrict)) Ok(delimited!(self, LCurlyBrace, statement, Newline | Semicolon, RCurlyBrace, nonstrict))
}); }
parse_method!(expr_or_block(&mut self) -> ParseResult<Block> { #[recursive_descent_method]
fn expr_or_block(&mut self) -> ParseResult<Block> {
match self.peek() { match self.peek() {
LCurlyBrace => self.block(), LCurlyBrace => self.block(),
_ => { _ => {
@ -826,9 +843,10 @@ impl Parser {
Ok(vec![Statement::ExpressionStatement(expr)]) Ok(vec![Statement::ExpressionStatement(expr)])
} }
} }
}); }
parse_method!(while_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn while_expr(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
expect!(self, Keyword(Kw::While)); expect!(self, Keyword(Kw::While));
let condition = { let condition = {
@ -839,16 +857,18 @@ impl Parser {
}; };
let body = self.block()?; let body = self.block()?;
Ok(Expression(WhileExpression {condition, body}, None)) Ok(Expression(WhileExpression {condition, body}, None))
}); }
parse_method!(while_cond(&mut self) -> ParseResult<Option<Expression>> { #[recursive_descent_method]
fn while_cond(&mut self) -> ParseResult<Option<Expression>> {
Ok(match self.peek() { Ok(match self.peek() {
LCurlyBrace => None, LCurlyBrace => None,
_ => Some(self.expression()?), _ => Some(self.expression()?),
}) })
}); }
parse_method!(for_expr(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn for_expr(&mut self) -> ParseResult<Expression> {
expect!(self, Keyword(Kw::For)); expect!(self, Keyword(Kw::For));
let enumerators = if let LCurlyBrace = self.peek() { let enumerators = if let LCurlyBrace = self.peek() {
delimited!(self, LCurlyBrace, enumerator, Comma | Newline, RCurlyBrace) delimited!(self, LCurlyBrace, enumerator, Comma | Newline, RCurlyBrace)
@ -863,16 +883,18 @@ impl Parser {
}; };
let body = Box::new(self.for_expr_body()?); let body = Box::new(self.for_expr_body()?);
Ok(Expression(ExpressionType::ForExpression { enumerators, body }, None)) Ok(Expression(ExpressionType::ForExpression { enumerators, body }, None))
}); }
parse_method!(enumerator(&mut self) -> ParseResult<Enumerator> { #[recursive_descent_method]
fn enumerator(&mut self) -> ParseResult<Enumerator> {
let id = self.identifier()?; let id = self.identifier()?;
expect!(self, Operator(ref c) if **c == "<-"); expect!(self, Operator(ref c) if **c == "<-");
let generator = self.expression()?; let generator = self.expression()?;
Ok(Enumerator { id, generator }) Ok(Enumerator { id, generator })
}); }
parse_method!(for_expr_body(&mut self) -> ParseResult<ForBody> { #[recursive_descent_method]
fn for_expr_body(&mut self) -> ParseResult<ForBody> {
use self::ForBody::*; use self::ForBody::*;
Ok(match self.peek() { Ok(match self.peek() {
LCurlyBrace => { LCurlyBrace => {
@ -885,16 +907,18 @@ impl Parser {
}, },
_ => return ParseError::new("for expressions must end in a block or 'return'"), _ => return ParseError::new("for expressions must end in a block or 'return'"),
}) })
}); }
parse_method!(identifier(&mut self) -> ParseResult<Rc<String>> { #[recursive_descent_method]
fn identifier(&mut self) -> ParseResult<Rc<String>> {
match self.next() { match self.next() {
Identifier(s) => Ok(s), Identifier(s) => Ok(s),
p => ParseError::new(&format!("Expected an identifier, got {:?}", p)), p => ParseError::new(&format!("Expected an identifier, got {:?}", p)),
} }
}); }
parse_method!(literal(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn literal(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
match self.peek() { match self.peek() {
DigitGroup(_) | HexLiteral(_) | BinNumberSigil | Period => self.number_literal(), DigitGroup(_) | HexLiteral(_) | BinNumberSigil | Period => self.number_literal(),
@ -912,7 +936,7 @@ impl Parser {
} }
e => ParseError::new(&format!("Expected a literal expression, got {:?}", e)), e => ParseError::new(&format!("Expected a literal expression, got {:?}", e)),
} }
}); }
#[recursive_descent_method] #[recursive_descent_method]
fn number_literal(&mut self) -> ParseResult<Expression> { fn number_literal(&mut self) -> ParseResult<Expression> {
@ -922,7 +946,8 @@ impl Parser {
} }
} }
parse_method!(int_literal(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn int_literal(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
match self.next() { match self.next() {
BinNumberSigil => { BinNumberSigil => {
@ -937,9 +962,10 @@ impl Parser {
}, },
_ => return ParseError::new("Expected '0x' or '0b'"), _ => return ParseError::new("Expected '0x' or '0b'"),
} }
}); }
parse_method!(float_literal(&mut self) -> ParseResult<Expression> { #[recursive_descent_method]
fn float_literal(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
let mut digits = self.digits()?; let mut digits = self.digits()?;
if let TokenType::Period = self.peek() { if let TokenType::Period = self.peek() {
@ -957,9 +983,10 @@ impl Parser {
Err(e) => ParseError::new(&format!("Integer failed to parse with error: {}", e)), Err(e) => ParseError::new(&format!("Integer failed to parse with error: {}", e)),
} }
} }
}); }
parse_method!(digits(&mut self) -> ParseResult<String> { #[recursive_descent_method]
fn digits(&mut self) -> ParseResult<String> {
let mut ds = String::new(); let mut ds = String::new();
loop { loop {
match self.peek() { match self.peek() {
@ -969,7 +996,7 @@ impl Parser {
} }
} }
Ok(ds) Ok(ds)
}); }
} }
fn parse_binary(digits: String) -> ParseResult<u64> { fn parse_binary(digits: String) -> ParseResult<u64> {