Interpreter Pattern

Defines a representation of grammar and an interpreter to evaluate sentences in the language, enabling the interpretation of a language or expression.

Example


use std::collections::HashMap;

trait Expression {
    fn interpret(&self, context: &Context) -> i32;
}

struct NumberExpression {
    value: i32,
}

impl NumberExpression {
    fn new(value: i32) -> Self {
        NumberExpression { value }
    }
}

impl Expression for NumberExpression {
    fn interpret(&self, _context: &Context) -> i32 {
        self.value
    }
}

struct AddExpression {
    left: Box<dyn Expression>,
    right: Box<dyn Expression>,
}

impl AddExpression {
    fn new(left: Box<dyn Expression>, right: Box<dyn Expression>) -> Self {
        AddExpression { left, right }
    }
}

impl Expression for AddExpression {
    fn interpret(&self, context: &Context) -> i32 {
        self.left.interpret(context) + self.right.interpret(context)
    }
}

struct Context {
    variables: HashMap<String, i32>,
}

impl Context {
    fn new() -> Self {
        Context {
            variables: HashMap::new(),
        }
    }

    fn set_variable(&mut self, name: &str, value: i32) {
        self.variables.insert(name.to_string(), value);
    }

    fn get_variable(&self, name: &str) -> Option<&i32> {
        self.variables.get(name)
    }
}

fn main() {
    let mut context = Context::new();
    context.set_variable("x", 5);
    context.set_variable("y", 3);

    let expression = AddExpression::new(
        Box::new(NumberExpression::new(2)),
        Box::new(AddExpression::new(
            Box::new(NumberExpression::new(3)),
            Box::new(NumberExpression::new(4)),
        )),
    );

    let result = expression.interpret(&context);
    println!("Result: {}", result);
}

Regular Expression

trait Regex {
    fn matches(&self, input: &str) -> bool;
}

struct EmailRegex {
    pattern: String,
}

impl EmailRegex {
    fn new(pattern: &str) -> Self {
        EmailRegex {
            pattern: pattern.to_string(),
        }
    }
}

impl Regex for EmailRegex {
    fn matches(&self, input: &str) -> bool {
        // Perform pattern matching logic based on the email regex pattern
        // Here, we'll assume a simplified implementation for demonstration purposes
        input.contains(&self.pattern)
    }
}

fn main() {
    let email_regex = EmailRegex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$");

    let email = "test@example.com";
    let is_valid = email_regex.matches(email);

    if is_valid {
        println!("The email is valid!");
    } else {
        println!("Invalid email.");
    }
}