From 4b879a5516491c58b8e6385180b77c565e05c935 Mon Sep 17 00:00:00 2001 From: Michael Sippel <micha@fragmental.art> Date: Wed, 15 May 2024 23:46:07 +0200 Subject: [PATCH] parser: make iterator type more generic --- src/parser.rs | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index d7002ec..05f5d36 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,7 +1,7 @@ use { crate::{ expr::{LTExpr, Statement, TypeError, TypeTag}, - lexer::{LTIRLexer, LTIRToken, LexError}, + lexer::{LTIRLexer, LTIRToken, LexError, InputRegionTag}, }, std::{ iter::Peekable, @@ -19,11 +19,10 @@ pub enum ParseError { } pub fn parse_expect<It>( - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, expected_token: LTIRToken, ) -> Result<(), ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { match tokens.next() { Some((region, Ok(t))) => { @@ -40,9 +39,8 @@ where /* parse symbol name */ -pub fn parse_symbol<It>(tokens: &mut Peekable<LTIRLexer<It>>) -> Result<String, ParseError> -where - It: Iterator<Item = char>, +pub fn parse_symbol<It>(tokens: &mut Peekable<It>) -> Result<String, ParseError> +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { match tokens.next() { Some((region, Ok(LTIRToken::Symbol(name)))) => Ok(name), @@ -57,10 +55,9 @@ where */ pub fn parse_type_tag<It>( typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>, - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result<Option<laddertypes::TypeTerm>, ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { if let Some((region, peektok)) = tokens.peek().clone() { match peektok.clone() { @@ -111,9 +108,9 @@ impl VariableBinding { */ pub fn parse_binding_expr<It>( typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>, - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result< VariableBinding, ParseError> -where It: Iterator<Item = char> +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { if let Some((region, peektok)) = tokens.peek().clone() { match peektok { @@ -142,10 +139,9 @@ where It: Iterator<Item = char> */ pub fn parse_binding_block<It>( typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>, - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result< Vec<VariableBinding>, ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { let _ = parse_expect(tokens, LTIRToken::BlockOpen)?; @@ -173,10 +169,9 @@ where pub fn parse_statement<It>( typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>, - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result<crate::expr::Statement, ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { if let Some((region, peektok)) = tokens.peek() { match peektok { @@ -251,10 +246,9 @@ where pub fn parse_statement_block<It>( typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>, - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result<Vec<Statement>, ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { let _ = parse_expect(tokens, LTIRToken::BlockOpen)?; @@ -278,10 +272,9 @@ where } pub fn parse_atom<It>( - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result<crate::expr::LTExpr, ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { match tokens.next() { Some((region, Ok(LTIRToken::Symbol(sym)))) => Ok(LTExpr::symbol(sym.as_str())), @@ -295,10 +288,9 @@ where pub fn parse_expr<It>( typectx: &Arc<RwLock<laddertypes::dict::TypeDict>>, - tokens: &mut Peekable<LTIRLexer<It>>, + tokens: &mut Peekable<It>, ) -> Result<crate::expr::LTExpr, ParseError> -where - It: Iterator<Item = char>, +where It: Iterator<Item = (InputRegionTag, Result<LTIRToken, LexError>)> { let mut children = Vec::new();