pub mod cache;
pub mod config;
pub mod constants;
pub mod error;
pub mod grammar;
pub mod lexer;
use crate::core::Expression;
pub use cache::*;
use config::ParserConfig;
pub use constants::*;
use error::ParseError;
pub struct Parser {
enable_implicit_multiplication: bool,
}
impl Parser {
pub fn new(config: &ParserConfig) -> Self {
Self {
enable_implicit_multiplication: config.enable_implicit_multiplication,
}
}
pub fn parse(&self, input: &str) -> Result<Expression, ParseError> {
if self.enable_implicit_multiplication {
self.parse_with_implicit_multiplication(input)
} else {
self.parse_explicit_only(input)
}
}
fn parse_with_implicit_multiplication(&self, input: &str) -> Result<Expression, ParseError> {
let enhanced_input =
lexer::ImplicitMultiplicationProcessor::insert_implicit_multiplication(input);
let parser = grammar::ExpressionParser::new();
parser
.parse(&enhanced_input)
.map_err(|e| ParseError::SyntaxError(format!("LALRPOP parse error: {:?}", e)))
}
fn parse_explicit_only(&self, input: &str) -> Result<Expression, ParseError> {
println!("Parsing with explicit operators only: {}", input);
let parser = grammar::ExpressionParser::new();
parser
.parse(input)
.map_err(|e| ParseError::SyntaxError(format!("LALRPOP parse error: {:?}", e)))
}
}
impl Default for Parser {
fn default() -> Self {
Self::new(&ParserConfig::default())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parser_modes() {
let config_implicit = ParserConfig {
enable_implicit_multiplication: true,
};
let parser_implicit = Parser::new(&config_implicit);
let config_explicit = ParserConfig {
enable_implicit_multiplication: false,
};
let parser_explicit = Parser::new(&config_explicit);
assert!(parser_implicit.parse("x + y").is_ok());
assert!(parser_explicit.parse("x + y").is_ok());
}
#[test]
fn test_implicit_multiplication_integration() {
let config = ParserConfig {
enable_implicit_multiplication: true,
};
let parser = Parser::new(&config);
println!("Testing: 2*x -> 2 * x");
assert!(parser.parse("2x").is_ok());
assert!(parser.parse("xy").is_ok());
assert!(parser.parse("2pi").is_ok());
assert!(parser.parse("2+3").is_ok());
assert!(parser.parse("x*y").is_ok());
assert!(parser.parse("a/b").is_ok());
}
}