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.");
}
}