diff --git a/ti-basic-optimizer/src/error_reporting.rs b/ti-basic-optimizer/src/error_reporting.rs index 2334a9f..0db51f8 100644 --- a/ti-basic-optimizer/src/error_reporting.rs +++ b/ti-basic-optimizer/src/error_reporting.rs @@ -4,7 +4,7 @@ use titokens::tokenizer::TokenBoundaries; macro_rules! next_or_err { ($tokens: ident) => { $tokens.next().ok_or_else(|| { - (crate::error_reporting::LineReport::new( + (crate::error_reporting::TokenReport::new( $tokens.current_position() - 2, "Unexpected end of input.", None, @@ -15,7 +15,7 @@ macro_rules! next_or_err { ($tokens: ident, $message: literal) => { $tokens.next().ok_or_else(|| { - (crate::error_reporting::LineReport::new( + (crate::error_reporting::TokenReport::new( $tokens.current_position() - 2, $message, None, @@ -26,10 +26,10 @@ macro_rules! next_or_err { } macro_rules! expect_tok { - ($tokens: ident, $token: expr, $token_name: literal) => { + ($tokens: ident, $token: pat, $token_name: literal) => { crate::error_reporting::next_or_err!($tokens).and_then(|tok| { - if tok != ($token) { - Err(crate::error_reporting::LineReport::new( + if !matches!(tok, $token) { + Err(crate::error_reporting::TokenReport::new( $tokens.current_position() - 1, concat!("Expected token \"", $token_name, "\"."), Some("Add the token."), @@ -43,7 +43,7 @@ macro_rules! expect_tok { ($tokens: ident, $token: expr, $error: literal, $help: literal) => { crate::error_reporting::next_or_err!($tokens).and_then(|tok| { if tok != ($token) { - Err(crate::error_reporting::LineReport::new( + Err(crate::error_reporting::TokenReport::new( $tokens.current_position() - 1, $error, Some($help), @@ -58,7 +58,7 @@ macro_rules! expect_tok { macro_rules! expect_some { ($option: expr, $tokens: ident, $expected_kind: literal) => { $option.ok_or_else(|| { - crate::error_reporting::LineReport::new( + crate::error_reporting::TokenReport::new( $tokens.current_position() - 1, concat!("Expected to find ", $expected_kind, "."), None, @@ -72,7 +72,7 @@ macro_rules! expect_some { ($option: expr, $tokens: ident, $expected_kind: literal, $help: literal) => { $option.ok_or_else(|| { - crate::error_reporting::LineReport::new( + crate::error_reporting::TokenReport::new( $tokens.current_position() - 1, concat!("Expected to find ", $expected_kind, "."), None, @@ -83,7 +83,7 @@ macro_rules! expect_some { ($option: expr, $tokens: ident, $ofs: expr, $expected_kind: literal, $help: literal) => { $option.ok_or_else(|| { - crate::error_reporting::LineReport::new( + crate::error_reporting::TokenReport::new( $tokens.current_position() - $ofs, concat!("Expected to find ", $expected_kind, "."), None, @@ -113,7 +113,7 @@ impl LabelKind { } #[derive(Debug, Clone)] -pub struct LineReport { +pub struct TokenReport { location: usize, message: String, suggestion: Option, @@ -122,10 +122,10 @@ pub struct LineReport { labels: Vec<(LabelKind, String)>, } -impl LineReport { +impl TokenReport { #[must_use] pub fn new(location: usize, message: &str, suggestion: Option<&str>) -> Self { - LineReport { + TokenReport { location, message: message.to_string(), suggestion: suggestion.map(|x| x.to_string()), diff --git a/ti-basic-optimizer/src/parse/commands/control_flow.rs b/ti-basic-optimizer/src/parse/commands/control_flow.rs index 23c222b..e0cb99e 100644 --- a/ti-basic-optimizer/src/parse/commands/control_flow.rs +++ b/ti-basic-optimizer/src/parse/commands/control_flow.rs @@ -4,7 +4,7 @@ mod menu; pub use {for_loop::ForLoop, isds::IsDs, menu::Menu}; -use crate::error_reporting::{expect_some, next_or_err, LineReport}; +use crate::error_reporting::{expect_some, next_or_err, TokenReport}; use crate::parse::{expression::Expression, Parse, Reconstruct}; use crate::Config; use std::iter::once; @@ -66,7 +66,7 @@ impl LabelName { } impl Parse for LabelName { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if !token.is_alphanumeric() { return Ok(None); } @@ -115,7 +115,7 @@ pub enum ControlFlow { impl Parse for ControlFlow { #[rustfmt::skip] - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { use ControlFlow as CF; use Expression as Expr; diff --git a/ti-basic-optimizer/src/parse/commands/control_flow/for_loop.rs b/ti-basic-optimizer/src/parse/commands/control_flow/for_loop.rs index 2fd4276..3ba8aca 100644 --- a/ti-basic-optimizer/src/parse/commands/control_flow/for_loop.rs +++ b/ti-basic-optimizer/src/parse/commands/control_flow/for_loop.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::{expect_some, expect_tok, next_or_err, LineReport}; +use crate::error_reporting::{expect_some, expect_tok, next_or_err, TokenReport}; use crate::parse::expression::Expression; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -16,7 +16,7 @@ pub struct ForLoop { } impl Parse for ForLoop { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token != Token::OneByte(0xD3) { return Ok(None); } diff --git a/ti-basic-optimizer/src/parse/commands/control_flow/isds.rs b/ti-basic-optimizer/src/parse/commands/control_flow/isds.rs index bb67e8c..df7abc8 100644 --- a/ti-basic-optimizer/src/parse/commands/control_flow/isds.rs +++ b/ti-basic-optimizer/src/parse/commands/control_flow/isds.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::{expect_some, expect_tok, next_or_err, LineReport}; +use crate::error_reporting::{expect_some, expect_tok, next_or_err, TokenReport}; use crate::parse::{components::NumericVarName, expression::Expression, Parse, Reconstruct}; use crate::Config; @@ -12,7 +12,7 @@ pub struct IsDs { } impl Parse for IsDs { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token == Token::OneByte(0xDA) || token == Token::OneByte(0xDB) { let variable = expect_some!( NumericVarName::parse(next_or_err!(more)?, more)?, diff --git a/ti-basic-optimizer/src/parse/commands/control_flow/menu.rs b/ti-basic-optimizer/src/parse/commands/control_flow/menu.rs index 0b3aa7b..6fa7de8 100644 --- a/ti-basic-optimizer/src/parse/commands/control_flow/menu.rs +++ b/ti-basic-optimizer/src/parse/commands/control_flow/menu.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::{expect_some, expect_tok, next_or_err, LineReport}; +use crate::error_reporting::{expect_some, expect_tok, next_or_err, TokenReport}; use crate::parse::{commands::control_flow::LabelName, expression::Expression, Parse, Reconstruct}; use crate::Config; use std::iter::once; @@ -12,7 +12,7 @@ pub struct Menu { } impl Parse for Menu { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token != Token::OneByte(0xE6) { return Ok(None); } @@ -60,7 +60,7 @@ impl Parse for Menu { Some(Token::OneByte(0x3E | 0x3F)) | None => break, // :, \n, EOF - Some(_) => Err(LineReport::new( + Some(_) => Err(TokenReport::new( more.current_position() - 1, "Unexpected character in Menu(", Some("perhaps it's unimplemented?"), diff --git a/ti-basic-optimizer/src/parse/commands/delvar_chain.rs b/ti-basic-optimizer/src/parse/commands/delvar_chain.rs index e7a49e4..077a0fb 100644 --- a/ti-basic-optimizer/src/parse/commands/delvar_chain.rs +++ b/ti-basic-optimizer/src/parse/commands/delvar_chain.rs @@ -1,9 +1,11 @@ -use crate::error_reporting::{next_or_err, LineReport}; +use crate::error_reporting::{next_or_err, TokenReport}; use crate::parse::{commands::Command, components::DelVarTarget, Parse, Reconstruct}; use crate::Config; use std::iter::once; use titokens::{Token, Tokens}; +/// `DelVar` statements do not require a trailing newline, and so a series of `deletions` can be +/// chained back-to-back. #[derive(Clone, Debug)] pub struct DelVarChain { pub deletions: Vec, @@ -11,7 +13,7 @@ pub struct DelVarChain { } impl Parse for DelVarChain { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token != Token::TwoByte(0xBB, 0x54) { return Ok(None); } diff --git a/ti-basic-optimizer/src/parse/commands/generic.rs b/ti-basic-optimizer/src/parse/commands/generic.rs index cf38a5f..19f4a8d 100644 --- a/ti-basic-optimizer/src/parse/commands/generic.rs +++ b/ti-basic-optimizer/src/parse/commands/generic.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::expression::Expression; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -13,7 +13,7 @@ pub struct Generic { } impl Parse for Generic { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if !Generic::recognize(token) { return Ok(None); } @@ -44,7 +44,7 @@ impl Parse for Generic { } Some(Token::OneByte(0x3E | 0x3F)) | None => break, // :, \n, EOF - Some(_) => Err(LineReport::new( + Some(_) => Err(TokenReport::new( more.current_position() - 1, "Unexpected character in command invocation", Some("perhaps it's unimplemented?"), diff --git a/ti-basic-optimizer/src/parse/commands/mod.rs b/ti-basic-optimizer/src/parse/commands/mod.rs index ff7786e..f93d399 100644 --- a/ti-basic-optimizer/src/parse/commands/mod.rs +++ b/ti-basic-optimizer/src/parse/commands/mod.rs @@ -12,7 +12,7 @@ pub use setupeditor::SetUpEditor; pub use generic::Generic; use std::iter::once; -use crate::error_reporting::{expect_some, next_or_err, LineReport}; +use crate::error_reporting::{expect_some, next_or_err, TokenReport}; use crate::parse::components::StoreTarget; use crate::parse::{expression::Expression, Parse, Reconstruct}; use crate::Config; @@ -31,7 +31,7 @@ pub enum Command { impl Parse for Command { #[allow(unused_parens)] - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if let Some(cmd) = Generic::parse(token, more)?.map(Command::Generic) { Ok(Some(cmd)) } else if let Some(cmd) = ControlFlow::parse(token, more)?.map(Command::ControlFlow) { diff --git a/ti-basic-optimizer/src/parse/commands/prgm.rs b/ti-basic-optimizer/src/parse/commands/prgm.rs index 40a7acd..38ea069 100644 --- a/ti-basic-optimizer/src/parse/commands/prgm.rs +++ b/ti-basic-optimizer/src/parse/commands/prgm.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use std::iter::once; @@ -10,7 +10,7 @@ pub struct ProgramName { } impl Parse for ProgramName { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token != Token::OneByte(0x5F) { return Ok(None); } @@ -23,7 +23,7 @@ impl Parse for ProgramName { || (name.is_empty() && token.is_alphanumeric()) { if name.len() > 8 { - Err(LineReport::new( + Err(TokenReport::new( start_position, "Program name has too many characters (max 8)", None, @@ -43,7 +43,7 @@ impl Parse for ProgramName { } if name.is_empty() { - Err(LineReport::new( + Err(TokenReport::new( start_position, "Expected a program name.", Some("Program names start with a letter A-θ."), diff --git a/ti-basic-optimizer/src/parse/commands/setupeditor.rs b/ti-basic-optimizer/src/parse/commands/setupeditor.rs index 1b2cc24..3500753 100644 --- a/ti-basic-optimizer/src/parse/commands/setupeditor.rs +++ b/ti-basic-optimizer/src/parse/commands/setupeditor.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::components::{ListName, DEFAULT_LISTS}; use crate::parse::{Parse, Reconstruct}; use titokens::{Token, Tokens}; @@ -12,7 +12,7 @@ pub struct SetUpEditor { } impl Parse for SetUpEditor { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token != Token::TwoByte(0xBB, 0x4A) { return Ok(None); } @@ -29,7 +29,7 @@ impl Parse for SetUpEditor { if let Some(name) = ListName::parse_custom_name(more)? { lists.push(name); } else { - Err(LineReport::new( + Err(TokenReport::new( more.current_position(), "Expected a list name", None, @@ -44,7 +44,7 @@ impl Parse for SetUpEditor { } Some(Token::OneByte(0x3E | 0x3F)) | None => break, // :, \n, EOF - Some(_) => Err(LineReport::new( + Some(_) => Err(TokenReport::new( more.current_position() - 1, "Unexpected character in SetUpEditor", None, diff --git a/ti-basic-optimizer/src/parse/components/data_access.rs b/ti-basic-optimizer/src/parse/components/data_access.rs index 433f58f..179e640 100644 --- a/ti-basic-optimizer/src/parse/components/data_access.rs +++ b/ti-basic-optimizer/src/parse/components/data_access.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::{expect_some, expect_tok, next_or_err, LineReport}; +use crate::error_reporting::{expect_some, expect_tok, next_or_err, TokenReport}; use crate::parse::{ components::{ListName, MatrixName, Operand}, expression::Expression, @@ -87,7 +87,7 @@ impl MatrixIndex { subject: MatrixIndexable, token: Token, more: &mut Tokens, - ) -> Result, LineReport> { + ) -> Result, TokenReport> { if token != Token::OneByte(0x10) { return Ok(None); } @@ -146,7 +146,7 @@ impl ListIndex { subject: ListIndexable, token: Token, more: &mut Tokens, - ) -> Result, LineReport> { + ) -> Result, TokenReport> { if token != Token::OneByte(0x10) { return Ok(None); } diff --git a/ti-basic-optimizer/src/parse/components/delvar_target.rs b/ti-basic-optimizer/src/parse/components/delvar_target.rs index c3e5fd7..b2f52a8 100644 --- a/ti-basic-optimizer/src/parse/components/delvar_target.rs +++ b/ti-basic-optimizer/src/parse/components/delvar_target.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{ components::{ EquationName, ImageName, ListIndex, ListName, MatrixIndex, MatrixName, NumericVarName, @@ -24,7 +24,7 @@ pub enum DelVarTarget { } impl Parse for DelVarTarget { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { match token { Token::OneByte(0x41..=0x5B) | Token::TwoByte(0x62, 0x21) => { Ok(NumericVarName::parse(token, more)?.map(Self::NumericVar)) diff --git a/ti-basic-optimizer/src/parse/components/equation_name.rs b/ti-basic-optimizer/src/parse/components/equation_name.rs index b04c0bb..7f3c032 100644 --- a/ti-basic-optimizer/src/parse/components/equation_name.rs +++ b/ti-basic-optimizer/src/parse/components/equation_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -7,7 +7,7 @@ use titokens::{Token, Tokens}; pub struct EquationName(Token); impl Parse for EquationName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::TwoByte(0x5E, 0x10..=0x2B | 0x40..=0x45 | 0x80..=0x82) => { Some(EquationName(token)) diff --git a/ti-basic-optimizer/src/parse/components/function_call.rs b/ti-basic-optimizer/src/parse/components/function_call.rs index f8e4467..4220578 100644 --- a/ti-basic-optimizer/src/parse/components/function_call.rs +++ b/ti-basic-optimizer/src/parse/components/function_call.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::expression::Expression; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -12,7 +12,7 @@ pub struct FunctionCall { } impl Parse for FunctionCall { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if !FunctionCall::recognize(token) { return Ok(None); } @@ -39,7 +39,7 @@ impl Parse for FunctionCall { Some(Token::OneByte(0x3E | 0x3F)) | None => break, // :, \n, EOF - Some(_) => Err(LineReport::new( + Some(_) => Err(TokenReport::new( more.current_position() - 1, "Unexpected character in function call", Some("perhaps it's unimplemented?"), diff --git a/ti-basic-optimizer/src/parse/components/list.rs b/ti-basic-optimizer/src/parse/components/list.rs index 626b57b..0c47cb6 100644 --- a/ti-basic-optimizer/src/parse/components/list.rs +++ b/ti-basic-optimizer/src/parse/components/list.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::{next_or_err, LineReport}; +use crate::error_reporting::{next_or_err, TokenReport}; use crate::parse::expression::Expression; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -11,7 +11,7 @@ pub struct TIList { } impl Parse for TIList { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { // { if token != Token::OneByte(0x08) { return Ok(None); diff --git a/ti-basic-optimizer/src/parse/components/list_name.rs b/ti-basic-optimizer/src/parse/components/list_name.rs index b0e187e..fee6c82 100644 --- a/ti-basic-optimizer/src/parse/components/list_name.rs +++ b/ti-basic-optimizer/src/parse/components/list_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::components::NumericVarName; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -35,7 +35,7 @@ impl TryFrom for ListName { impl ListName { /// Parse the up-to-5-character custom list name, without the beginning |L. - pub fn parse_custom_name(tokens: &mut Tokens) -> Result, LineReport> { + pub fn parse_custom_name(tokens: &mut Tokens) -> Result, TokenReport> { let start_position = tokens.current_position() - 1; let mut name = [0_u8; 5]; let mut index = 0; @@ -44,7 +44,7 @@ impl ListName { if (index == 0 && token.is_alpha()) || (index > 0 && token.is_alphanumeric()) { // 0-indexed if index >= 5 { - return Err(LineReport::new( + return Err(TokenReport::new( start_position, "List name has too many characters (max 5)", None, @@ -65,7 +65,7 @@ impl ListName { } if index == 0 { - Err(LineReport::new( + Err(TokenReport::new( start_position, "Expected a list name.", Some("List names start with a letter A-θ."), @@ -91,7 +91,7 @@ impl ListName { } impl Parse for ListName { - fn parse(token: Token, tokens: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, tokens: &mut Tokens) -> Result, TokenReport> { match token { // 5Dxx, lists Token::TwoByte(0x5D, 0x00..=0x05) => Ok(Some(ListName::Default(token))), diff --git a/ti-basic-optimizer/src/parse/components/matrix_name.rs b/ti-basic-optimizer/src/parse/components/matrix_name.rs index 3cd5ae0..9b34996 100644 --- a/ti-basic-optimizer/src/parse/components/matrix_name.rs +++ b/ti-basic-optimizer/src/parse/components/matrix_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -7,7 +7,7 @@ use titokens::{Token, Tokens}; pub struct MatrixName(Token); impl Parse for MatrixName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::TwoByte(0x5C, 0x00..=0x08) => Some(MatrixName(token)), _ => None, diff --git a/ti-basic-optimizer/src/parse/components/mod.rs b/ti-basic-optimizer/src/parse/components/mod.rs index c1ba2fa..5b711c2 100644 --- a/ti-basic-optimizer/src/parse/components/mod.rs +++ b/ti-basic-optimizer/src/parse/components/mod.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; pub use crate::parse::components::{ binary_operator::BinOp, data_access::{ListIndex, ListIndexable, MatrixIndex, MatrixIndexable}, @@ -90,7 +90,7 @@ pub enum Operand { } impl Parse for Operand { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { match token { Token::OneByte(0x30..=0x39 | 0x3A | 0x3B) => { Ok(tifloats::Float::parse(token, more)?.map(Self::NumericLiteral)) diff --git a/ti-basic-optimizer/src/parse/components/numeric_literal.rs b/ti-basic-optimizer/src/parse/components/numeric_literal.rs index b011e7b..62cb152 100644 --- a/ti-basic-optimizer/src/parse/components/numeric_literal.rs +++ b/ti-basic-optimizer/src/parse/components/numeric_literal.rs @@ -1,6 +1,6 @@ use tifloats::{tifloat, Float}; -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::components::{string::TIString, Operand}; use crate::parse::Parse; use titokens::{Token, Tokens}; @@ -178,7 +178,7 @@ impl<'a> Builder<'a> { } impl Parse for tifloats::Float { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { match token { Token::OneByte(0x30..=0x3B) => { more.backtrack_once(); diff --git a/ti-basic-optimizer/src/parse/components/numeric_var_name.rs b/ti-basic-optimizer/src/parse/components/numeric_var_name.rs index d579a9e..765ba9a 100644 --- a/ti-basic-optimizer/src/parse/components/numeric_var_name.rs +++ b/ti-basic-optimizer/src/parse/components/numeric_var_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -7,7 +7,7 @@ use titokens::{Token, Tokens}; pub struct NumericVarName(pub Token); impl Parse for NumericVarName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::OneByte(0x41..=0x5B) | Token::TwoByte(0x62, 0x21) => Some(NumericVarName(token)), diff --git a/ti-basic-optimizer/src/parse/components/pic_image_name.rs b/ti-basic-optimizer/src/parse/components/pic_image_name.rs index a5e0e5e..f52284e 100644 --- a/ti-basic-optimizer/src/parse/components/pic_image_name.rs +++ b/ti-basic-optimizer/src/parse/components/pic_image_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -7,7 +7,7 @@ use titokens::{Token, Tokens}; pub struct PicName(Token); impl Parse for PicName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::TwoByte(0x60, 0x00..=0x0A) => Some(PicName(token)), _ => None, @@ -25,7 +25,7 @@ impl Reconstruct for PicName { pub struct ImageName(Token); impl Parse for ImageName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::TwoByte(0xEF, 0x50..=0x59) => Some(ImageName(token)), _ => None, diff --git a/ti-basic-optimizer/src/parse/components/store_target.rs b/ti-basic-optimizer/src/parse/components/store_target.rs index 1ef512a..5138e51 100644 --- a/ti-basic-optimizer/src/parse/components/store_target.rs +++ b/ti-basic-optimizer/src/parse/components/store_target.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::{next_or_err, LineReport}; +use crate::error_reporting::{next_or_err, TokenReport}; use crate::parse::{ components::{ EquationName, ListIndex, ListName, MatrixIndex, MatrixName, NumericVarName, StringName, @@ -27,7 +27,7 @@ pub enum StoreTarget { } impl Parse for StoreTarget { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { match token { Token::OneByte(0x41..=0x5B) => { if matches!(more.peek(), Some(Token::OneByte(0x41..=0x5B))) { @@ -73,7 +73,7 @@ impl Parse for StoreTarget { } else if let Some(matrix) = MatrixName::parse(next, more)? { Ok(Some(Self::MatrixResizing(matrix))) } else { - Err(LineReport::new( + Err(TokenReport::new( more.current_position(), "Expected a list or matrix name.", Some("Storing to a dim( of a list or matrix resizes that list or matrix."), diff --git a/ti-basic-optimizer/src/parse/components/string.rs b/ti-basic-optimizer/src/parse/components/string.rs index cf54a21..5372f5c 100644 --- a/ti-basic-optimizer/src/parse/components/string.rs +++ b/ti-basic-optimizer/src/parse/components/string.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -26,7 +26,7 @@ impl TIString { } impl Parse for TIString { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport> { if token != Token::OneByte(0x2A) { return Ok(None); } diff --git a/ti-basic-optimizer/src/parse/components/string_name.rs b/ti-basic-optimizer/src/parse/components/string_name.rs index 307162a..5900ea9 100644 --- a/ti-basic-optimizer/src/parse/components/string_name.rs +++ b/ti-basic-optimizer/src/parse/components/string_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -7,7 +7,7 @@ use titokens::{Token, Tokens}; pub struct StringName(Token); impl Parse for StringName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::TwoByte(0xAA, 0x00..=0x0A) => Some(StringName(token)), _ => None, diff --git a/ti-basic-optimizer/src/parse/components/window_var_name.rs b/ti-basic-optimizer/src/parse/components/window_var_name.rs index 0923cfa..731dfe8 100644 --- a/ti-basic-optimizer/src/parse/components/window_var_name.rs +++ b/ti-basic-optimizer/src/parse/components/window_var_name.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::{Parse, Reconstruct}; use crate::Config; use titokens::{Token, Tokens}; @@ -7,7 +7,7 @@ use titokens::{Token, Tokens}; pub struct WindowVarName(Token); impl Parse for WindowVarName { - fn parse(token: Token, _more: &mut Tokens) -> Result, LineReport> { + fn parse(token: Token, _more: &mut Tokens) -> Result, TokenReport> { Ok(match token { Token::TwoByte(0x63, 0x00..=0x2A | 0x32..=0x38) => Some(WindowVarName(token)), diff --git a/ti-basic-optimizer/src/parse/expression.rs b/ti-basic-optimizer/src/parse/expression.rs index 51651d5..671cc19 100644 --- a/ti-basic-optimizer/src/parse/expression.rs +++ b/ti-basic-optimizer/src/parse/expression.rs @@ -1,4 +1,4 @@ -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::components::*; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -36,7 +36,7 @@ impl<'a> Builder<'a> { } } - pub fn build(mut self) -> Result, LineReport> { + pub fn build(mut self) -> Result, TokenReport> { while let Some(next) = self.tokens.next() { if !self.process_next(next)? { break; @@ -48,8 +48,8 @@ impl<'a> Builder<'a> { self.finalize() } - fn error(&self, code: usize) -> LineReport { - LineReport::new( + fn error(&self, code: usize) -> TokenReport { + TokenReport::new( self.tokens.current_position(), "Expression parsing error", Some("Please report this if this is unexpected."), @@ -66,7 +66,7 @@ impl<'a> Builder<'a> { } #[allow(clippy::let_and_return)] - fn process_next(&mut self, next: Token) -> Result { + fn process_next(&mut self, next: Token) -> Result { let result = if !self.process_operand_stack(next)? { match next { Token::OneByte(0x10) => { @@ -112,7 +112,7 @@ impl<'a> Builder<'a> { result } - fn process_operand_stack(&mut self, next: Token) -> Result { + fn process_operand_stack(&mut self, next: Token) -> Result { if let Some(operand) = Operand::parse(next, self.tokens)? { self.check_implicit_mul()?; @@ -148,7 +148,7 @@ impl<'a> Builder<'a> { self.implicit_mul_allowed = true; } - fn open_paren(&mut self) -> Result<(), LineReport> { + fn open_paren(&mut self) -> Result<(), TokenReport> { self.paren_depth += 1; self.check_implicit_mul()?; self.operator_stack.push(Token::OneByte(0x10)); // ( @@ -156,7 +156,7 @@ impl<'a> Builder<'a> { Ok(()) } - fn close_paren(&mut self) -> Result<(), LineReport> { + fn close_paren(&mut self) -> Result<(), TokenReport> { self.paren_depth -= 1; while let Some(&token) = self.operator_stack.last() { @@ -179,7 +179,7 @@ impl<'a> Builder<'a> { Ok(()) } - fn check_implicit_mul(&mut self) -> Result<(), LineReport> { + fn check_implicit_mul(&mut self) -> Result<(), TokenReport> { if self.implicit_mul_allowed { self.push_binop(Token::OneByte(0x82))?; // * } @@ -187,7 +187,7 @@ impl<'a> Builder<'a> { Ok(()) } - fn push_binop(&mut self, operator: Token) -> Result<(), LineReport> { + fn push_binop(&mut self, operator: Token) -> Result<(), TokenReport> { assert!(BinOp::recognize(operator)); let precedence = BinOp::recognize_precedence(operator).unwrap(); @@ -210,7 +210,7 @@ impl<'a> Builder<'a> { Ok(()) } - fn process_operator(&mut self, operator: Token) -> Result { + fn process_operator(&mut self, operator: Token) -> Result { if UnOp::recognize(operator) { let child = self.operand_stack.pop().ok_or_else(|| self.error(5))?; @@ -252,7 +252,7 @@ impl<'a> Builder<'a> { todo!(); } - fn finalize(&mut self) -> Result, LineReport> { + fn finalize(&mut self) -> Result, TokenReport> { while let Some(x) = self.operator_stack.pop() { if !matches!(x, Token::OneByte(0x10)) { // everything besides ( @@ -271,7 +271,7 @@ impl<'a> Builder<'a> { } impl Parse for Expression { - fn parse(_token: Token, more: &mut Tokens) -> Result, LineReport> { + fn parse(_token: Token, more: &mut Tokens) -> Result, TokenReport> { more.backtrack_once(); let builder = Builder::new(more); diff --git a/ti-basic-optimizer/src/parse/mod.rs b/ti-basic-optimizer/src/parse/mod.rs index 83fe063..9dc3eb8 100644 --- a/ti-basic-optimizer/src/parse/mod.rs +++ b/ti-basic-optimizer/src/parse/mod.rs @@ -7,10 +7,10 @@ mod program; pub use program::Program; -use crate::{error_reporting::LineReport, Config}; +use crate::{error_reporting::TokenReport, Config}; pub(crate) trait Parse: Sized { - fn parse(token: Token, more: &mut Tokens) -> Result, LineReport>; + fn parse(token: Token, more: &mut Tokens) -> Result, TokenReport>; } pub(crate) trait Reconstruct { diff --git a/ti-basic-optimizer/src/parse/program.rs b/ti-basic-optimizer/src/parse/program.rs index 000da88..de25651 100644 --- a/ti-basic-optimizer/src/parse/program.rs +++ b/ti-basic-optimizer/src/parse/program.rs @@ -1,6 +1,6 @@ use itertools::Itertools; -use crate::error_reporting::LineReport; +use crate::error_reporting::TokenReport; use crate::parse::commands::Command; use crate::parse::{Parse, Reconstruct}; use crate::Config; @@ -52,7 +52,7 @@ impl Program { } } - fn parse(tokens: &mut Tokens) -> Result { + fn parse(tokens: &mut Tokens) -> Result { let mut lines = vec![]; let mut line_number = 1;