• C++中的解释器模式


    目录

    解释器模式(Interpreter Pattern)

    实际应用

    算术表达式解释器

    布尔表达式解释器

    总结


    解释器模式(Interpreter Pattern)

    解释器模式是一种行为设计模式,它定义了一种语言的文法表示,并使用解释器来解释这些文法。该模式适用于那些有特定语法规则的场景,比如编译器、正则表达式引擎和计算器。

    实际应用

    算术表达式解释器

    算术表达式解释器 -- 可以解析和计算包含加法和减法的算术表达式。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. // 抽象表达式
    7. class Expression {
    8. public:
    9. virtual ~Expression() = default;
    10. virtual int interpret(const std::unordered_map<char, int>& context) = 0;
    11. };
    12. // 终结符表达式(变量)
    13. class VariableExpression : public Expression {
    14. private:
    15. char name;
    16. public:
    17. VariableExpression(char name) : name(name) {}
    18. int interpret(const std::unordered_map<char, int>& context) override {
    19. return context.at(name);
    20. }
    21. };
    22. // 非终结符表达式(加法)
    23. class AddExpression : public Expression {
    24. private:
    25. std::shared_ptr left, right;
    26. public:
    27. AddExpression(std::shared_ptr left, std::shared_ptr right)
    28. : left(left), right(right) {}
    29. int interpret(const std::unordered_map<char, int>& context) override {
    30. return left->interpret(context) + right->interpret(context);
    31. }
    32. };
    33. // 非终结符表达式(减法)
    34. class SubtractExpression : public Expression {
    35. private:
    36. std::shared_ptr left, right;
    37. public:
    38. SubtractExpression(std::shared_ptr left, std::shared_ptr right)
    39. : left(left), right(right) {}
    40. int interpret(const std::unordered_map<char, int>& context) override {
    41. return left->interpret(context) - right->interpret(context);
    42. }
    43. };
    44. // 客户端代码:解析并计算表达式
    45. int main() {
    46. std::string expr = "a+b-c";
    47. std::unordered_map<char, int> context = {{'a', 5}, {'b', 3}, {'c', 2}};
    48. std::stack> stack;
    49. for (char token : expr) {
    50. if (isalpha(token)) {
    51. stack.push(std::make_shared(token));
    52. } else if (token == '+') {
    53. auto right = stack.top(); stack.pop();
    54. auto left = stack.top(); stack.pop();
    55. stack.push(std::make_shared(left, right));
    56. } else if (token == '-') {
    57. auto right = stack.top(); stack.pop();
    58. auto left = stack.top(); stack.pop();
    59. stack.push(std::make_shared(left, right));
    60. }
    61. }
    62. auto expression = stack.top();
    63. int result = expression->interpret(context);
    64. std::cout << "Result: " << result << std::endl;
    65. return 0;
    66. }

    布尔表达式解释器

    布尔表达式解释器 -- 可以解析和计算包含与(AND)和或(OR)的布尔表达式。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. // 抽象表达式
    7. class Expression {
    8. public:
    9. virtual ~Expression() = default;
    10. virtual bool interpret(const std::unordered_mapbool>& context) = 0;
    11. };
    12. // 终结符表达式(变量)
    13. class VariableExpression : public Expression {
    14. private:
    15. std::string name;
    16. public:
    17. VariableExpression(const std::string& name) : name(name) {}
    18. bool interpret(const std::unordered_mapbool>& context) override {
    19. return context.at(name);
    20. }
    21. };
    22. // 非终结符表达式(与操作)
    23. class AndExpression : public Expression {
    24. private:
    25. std::shared_ptr left, right;
    26. public:
    27. AndExpression(std::shared_ptr left, std::shared_ptr right)
    28. : left(left), right(right) {}
    29. bool interpret(const std::unordered_mapbool>& context) override {
    30. return left->interpret(context) && right->interpret(context);
    31. }
    32. };
    33. // 非终结符表达式(或操作)
    34. class OrExpression : public Expression {
    35. private:
    36. std::shared_ptr left, right;
    37. public:
    38. OrExpression(std::shared_ptr left, std::shared_ptr right)
    39. : left(left), right(right) {}
    40. bool interpret(const std::unordered_mapbool>& context) override {
    41. return left->interpret(context) || right->interpret(context);
    42. }
    43. };
    44. // 客户端代码:解析并计算布尔表达式
    45. int main() {
    46. std::string expr = "a AND b OR c";
    47. std::unordered_mapbool> context = {{"a", true}, {"b", false}, {"c", true}};
    48. std::stack> stack;
    49. std::istringstream iss(expr);
    50. std::string token;
    51. while (iss >> token) {
    52. if (token == "a" || token == "b" || token == "c") {
    53. stack.push(std::make_shared(token));
    54. } else if (token == "AND") {
    55. auto right = stack.top(); stack.pop();
    56. auto left = stack.top(); stack.pop();
    57. stack.push(std::make_shared(left, right));
    58. } else if (token == "OR") {
    59. auto right = stack.top(); stack.pop();
    60. auto left = stack.top(); stack.pop();
    61. stack.push(std::make_shared(left, right));
    62. }
    63. }
    64. auto expression = stack.top();
    65. bool result = expression->interpret(context);
    66. std::cout << "Result: " << std::boolalpha << result << std::endl;
    67. return 0;
    68. }

    总结

    解释器模式可以帮助我们定义和解释特定语言的语法规则,并将这些规则应用于不同的上下文。

  • 相关阅读:
    Decoupled Contrastive Learning 论文解读和感想
    记录一次慢SQL优化:大表关联小表->拆解为单表查询
    [Linux入门]---Linux指令②
    【深入理解Kotlin协程】使用Job控制协程的生命周期
    MapReduce序列化【用户流量使用统计】
    LeetCode 2 两数相加
    PWN攻防世界guess_num
    【C++】vector笔记+模拟实现
    2 个python美化表格数据输出结果的工具,摸鱼简直心安理得~
    研发管理的挑战
  • 原文地址:https://blog.csdn.net/GOLOJO/article/details/139605161