From 09348ba7266d9ebfea5d329f8ec35cb6fa5dedd5 Mon Sep 17 00:00:00 2001 From: PaddiM8 Date: Thu, 6 Jan 2022 01:36:13 +0100 Subject: [PATCH] Simplify indexer parsing for variables with lowered part --- kalk/src/parser.rs | 25 ++++++++++--------------- kalk/src/symbol_table.rs | 2 +- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/kalk/src/parser.rs b/kalk/src/parser.rs index 6c21cdd..3e65beb 100644 --- a/kalk/src/parser.rs +++ b/kalk/src/parser.rs @@ -14,7 +14,6 @@ pub const DEFAULT_ANGLE_UNIT: &'static str = "rad"; /// Struct containing the current state of the parser. It stores user-defined functions and variables. #[wasm_bindgen] -#[derive(Clone)] pub struct Context { tokens: Vec, pos: usize, @@ -725,21 +724,17 @@ fn parse_identifier(context: &mut Context) -> Result { let underscore_pos = identifier.pure_name.find('_').unwrap(); let var_name = &identifier.pure_name[0..underscore_pos]; let lowered = &identifier.pure_name[underscore_pos + 1..]; + let lowered_expr = + if lowered.len() > 0 && lowered.chars().nth(0).unwrap_or('\0').is_digit(10) { + Expr::Literal(lowered.parse::().unwrap_or(f64::NAN)) + } else { + Expr::Var(Identifier::from_full_name(lowered)) + }; - // Create a new identical context to avoid changing the current one - let mut lowered_context = context.clone(); - let mut parsed_stmts = parse(&mut lowered_context, &lowered)?; - let parsed_lowered = parsed_stmts - .pop() - .unwrap_or(Stmt::Expr(Box::new(Expr::Literal(0f64)))); - if let Stmt::Expr(lowered_expr) = parsed_lowered { - Ok(Expr::Indexer( - Box::new(Expr::Var(Identifier::from_full_name(&var_name))), - lowered_expr, - )) - } else { - Err(CalcError::UnableToParseExpression) - } + Ok(Expr::Indexer( + Box::new(Expr::Var(Identifier::from_full_name(&var_name))), + Box::new(lowered_expr), + )) } else if context.parsing_unit_decl { context.unit_decl_base_unit = Some(identifier.full_name); Ok(Expr::Var(Identifier::from_full_name(DECL_UNIT))) diff --git a/kalk/src/symbol_table.rs b/kalk/src/symbol_table.rs index e711656..207cc1a 100644 --- a/kalk/src/symbol_table.rs +++ b/kalk/src/symbol_table.rs @@ -1,7 +1,7 @@ use crate::{ast::Expr, ast::Identifier, ast::Stmt, prelude}; use std::collections::HashMap; -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct SymbolTable { pub(crate) hashmap: HashMap, pub(crate) unit_types: HashMap,