diff --git a/src/schala_lang/parsing.rs b/src/schala_lang/parsing.rs index a777a5e..aebfec0 100644 --- a/src/schala_lang/parsing.rs +++ b/src/schala_lang/parsing.rs @@ -376,7 +376,10 @@ impl ParseError { pub type ParseResult = Result; #[derive(Debug)] -pub struct ParseRecord(String); +pub struct ParseRecord { + production_name: String, + next_token: String, +} struct Parser { tokens: TokenIter, @@ -487,7 +490,10 @@ macro_rules! parse_method { ($name:ident(&mut $self:ident) -> $type:ty $body:block) => { fn $name(&mut $self) -> $type { let next_token = $self.peek(); - let record = ParseRecord(format!("production {}, Token: {:?}", stringify!($name), next_token)); + let record = ParseRecord { + production_name: stringify!($name).to_string(), + next_token: format!("{:?}", next_token), + }; $self.parse_record.push(record); $body } @@ -566,6 +572,13 @@ impl Parser { fn precedence_expr(&mut self, precedence: i32) -> ParseResult { use self::Expression::*; + let next_token = self.peek(); + let record = ParseRecord { + production_name: "precedence_expr".to_string(), + next_token: format!("{:?}", next_token), + }; + self.parse_record.push(record); + //TODO clean this up let mut lhs = self.primary()?; loop { @@ -752,7 +765,10 @@ fn parse_binary(digits: String) -> ParseResult { pub fn parse(input: Vec) -> (Result, Vec) { let mut parser = Parser::new(input); let ast = parser.program(); - let trace = parser.parse_record.into_iter().map(|r| r.0).collect(); + + let trace = parser.parse_record.into_iter().map(|r| { + format!("Production `{}`, token: {:?}", r.production_name, r.next_token) + }).collect(); (ast, trace) }