From 43995dd6cfc3f5c0a5de9c1d6267c850c07e1652 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Wed, 15 Jul 2015 05:14:50 -0400 Subject: [PATCH] convert state fns to use rust_fn_header --- lalrpop/src/grammar/parse_tree.rs | 2 +- lalrpop/src/lr1/ascent.rs | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/lalrpop/src/grammar/parse_tree.rs b/lalrpop/src/grammar/parse_tree.rs index bdc05c1..57b7c93 100644 --- a/lalrpop/src/grammar/parse_tree.rs +++ b/lalrpop/src/grammar/parse_tree.rs @@ -328,7 +328,7 @@ impl Display for MacroSymbol { impl Display for TypeParameter { fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> { match *self { - TypeParameter::Lifetime(s) => write!(fmt, "'{}", s), + TypeParameter::Lifetime(s) => write!(fmt, "{}", s), TypeParameter::Id(s) => write!(fmt, "{}", s), } } diff --git a/lalrpop/src/lr1/ascent.rs b/lalrpop/src/lr1/ascent.rs index 9b6b13f..49a31b9 100644 --- a/lalrpop/src/lr1/ascent.rs +++ b/lalrpop/src/lr1/ascent.rs @@ -150,18 +150,25 @@ impl<'ascent,'grammar,W:Write> RecursiveAscent<'ascent,'grammar,W> { // set to true if goto actions are worth generating let mut fallthrough = false; - rust!(self.out, "pub fn {}state{}<", self.prefix, this_index.0); - rust!(self.out, " {}TOKENS: Iterator,", self.prefix, terminal_type); - rust!(self.out, ">("); - rust!(self.out, "mut {}lookahead: Option<{}>,", self.prefix, terminal_type); - rust!(self.out, "{}tokens: &mut {}TOKENS,", self.prefix, self.prefix); - for i in 0..this_prefix.len() { - rust!(self.out, "{}sym{}: &mut Option<{}>,", - self.prefix, i, this_prefix[i].ty(&self.types)); - } - rust!(self.out, ") -> Result<(Option<{}>, {}Nonterminal), Option<{}>> {{", - terminal_type, self.prefix, terminal_type); + let base_args = + vec![format!("mut {}lookahead: Option<{}>", self.prefix, terminal_type), + format!("{}tokens: &mut {}TOKENS", self.prefix, self.prefix)]; + let sym_args: Vec<_> = + (0..this_prefix.len()) + .map(|i| format!("{}sym{}: &mut Option<{}>", + self.prefix, i, this_prefix[i].ty(&self.types))) + .collect(); + try!(self.out.write_pub_fn_header( + self.grammar, + format!("{}state{}", self.prefix, this_index.0), + vec![format!("{}TOKENS: Iterator", self.prefix, terminal_type)], + base_args.into_iter().chain(sym_args).collect(), + format!("Result<(Option<{}>, {}Nonterminal), Option<{}>>", + terminal_type, self.prefix, terminal_type), + vec![])); + + rust!(self.out, "{{"); rust!(self.out, "let mut {}result: (Option<{}>, {}Nonterminal);", self.prefix, terminal_type, self.prefix);