{"id":1788,"date":"2023-05-09T14:02:29","date_gmt":"2023-05-09T07:02:29","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=1788"},"modified":"2023-05-09T14:03:15","modified_gmt":"2023-05-09T07:03:15","slug":"csharp-interpreter-pattern","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-interpreter-pattern\/","title":{"rendered":"C# Interpreter Pattern"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn how to use the C# interpreter pattern to build grammar for interpreting a simple language.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to the C# interpreter pattern<\/h2>\n\n\n\n<p>The interpreter pattern is a behavior pattern that allows you to build an interpreter for a simple language and specifies how to evaluate sentences or expressions in that language.<\/p>\n\n\n\n<p>The interpreter pattern defines the grammar of the language and provides a way to evaluate the grammar.<\/p>\n\n\n\n<p>Typically, the grammar consists of a set of <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-class\/\">classes<\/a>, each of which represents a rule in the grammar. The interpreter pattern combines the rules to form a hierarchy with the most basic rules at the bottom and the more complex rules at the top,<\/p>\n\n\n\n<p>For example, the following picture illustrates an expression 10 + 20 * (2 + 3) as a tree of rules:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/05\/CSharp-Interpreter-Tree-Structure.svg\" alt=\"C# Interpreter Tree Structure\" class=\"wp-image-1792\"\/><\/figure>\n<\/div>\n\n\n<p>To evaluate a sentence or expression, the interpreter takes input and applies the grammar rules to it. More specifically, the interpreter recursively evaluates the rules, applies the most basic rules first, and combines the result of each evaluation until the entire sentence or expression is evaluated.<\/p>\n\n\n\n<p>The result of the evaluation is typically a value or a set of values, depending on the specific application of the interpreter.<\/p>\n\n\n\n<p>The following UML diagram illustrates the Interpreter pattern:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/05\/csharp-interpreter-pattern.svg\" alt=\"C# Interpreter Pattern\" class=\"wp-image-1790\"\/><\/figure>\n<\/div>\n\n\n<p>The interpreter pattern involves the following participants:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>AbstractExpression<\/code> is an abstract class or an interface that has <code>interpret()<\/code> method for evaluating the expression.<\/li>\n\n\n\n<li><code><code>TerminalExpression<\/code><\/code> is a concrete implementation of the abstract expression. The <code><code>TerminalExpression<\/code><\/code> represents the simplest elements of the grammar such as variables, constants, or literals. A terminal expression cannot be further decomposed into smaller expressions. For example, in an arithmetic expression grammar, a terminal expression could be a number or a variable.<\/li>\n\n\n\n<li><code>NonTerminalExpression<\/code> represents the more complex elements of the language grammar built from simpler expressions. Unlike a terminal expression, a non-terminal expression can be decomposed into smaller expressions until they reach terminal expressions. For example, in an arithmetic expression grammar, a non-terminal expression could represent a binary operation such as addition, which is built from two terminal expressions.<\/li>\n\n\n\n<li><code>Context<\/code> is the context in that the interpreter evaluates the expression. It contains the information required for the evaluation of the expression.<\/li>\n\n\n\n<li><code>Client<\/code> is a class that is responsible for building an expression using the <code>TerminalExpression<\/code> and <code>NonterminalExpression<\/code>. It passes the expression to the interpreter for evaluation.<\/li>\n<\/ul>\n\n\n\n<p>For example, the following picture shows the terminal and non-terminal expressions:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/05\/CSharp-Interpreter-TerminalExpression-and-NonTerminal-Expression-1.svg\" alt=\"C# Interpreter - TerminalExpression and NonTerminal Expression\" class=\"wp-image-1795\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">C# interpreter pattern example<\/h2>\n\n\n\n<p>The following program demonstrates how to use the C# interpreter pattern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">IterpreterPattern<\/span>;\n\n<span class=\"hljs-comment\">\/\/ Abstract Expression<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>;\n}\n\n<span class=\"hljs-comment\">\/\/ Terminal Expression<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NumberExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">int<\/span> number;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">NumberExpression<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span> number<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">this<\/span>.number = number;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> number;\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Non-terminal Expression<\/span>\n<span class=\"hljs-keyword\">public<\/span>  <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AddExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">AddExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) + _right.Interpret(context);\n    }\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubtractExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">SubtractExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) - _right.Interpret(context);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MultiplyExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MultiplyExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) * _right.Interpret(context);\n    }\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DivideExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">DivideExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) \/ _right.Interpret(context);\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Context<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Context<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">int<\/span>&gt; _variables;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Context<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _variables = <span class=\"hljs-keyword\">new<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">int<\/span>&gt;();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SetVariable<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> name, <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-keyword\">value<\/span><\/span>)<\/span>\n    {\n        _variables&#91;name] = <span class=\"hljs-keyword\">value<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">GetVariable<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> name<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (_variables.TryGetValue(name, <span class=\"hljs-keyword\">out<\/span> <span class=\"hljs-keyword\">var<\/span> <span class=\"hljs-keyword\">value<\/span>))\n        {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">value<\/span>;\n        }\n        <span class=\"hljs-keyword\">else<\/span>\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">$\"Variable '<span class=\"hljs-subst\">{name}<\/span>' not found.\"<\/span>);\n        }\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Client<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Client<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> context = <span class=\"hljs-keyword\">new<\/span> Context();\n        context.SetVariable(<span class=\"hljs-string\">\"x\"<\/span>, <span class=\"hljs-number\">2<\/span>);\n        context.SetVariable(<span class=\"hljs-string\">\"y\"<\/span>, <span class=\"hljs-number\">3<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ -&gt; 10 + 20*(x + y)<\/span>\n        <span class=\"hljs-keyword\">var<\/span> expression = <span class=\"hljs-keyword\">new<\/span> AddExpression(\n            <span class=\"hljs-keyword\">new<\/span> NumberExpression(<span class=\"hljs-number\">10<\/span>),\n            <span class=\"hljs-keyword\">new<\/span> MultiplyExpression(  \n                <span class=\"hljs-keyword\">new<\/span> NumberExpression(<span class=\"hljs-number\">20<\/span>),\n                <span class=\"hljs-keyword\">new<\/span> AddExpression(\n                    <span class=\"hljs-keyword\">new<\/span> NumberExpression(context.GetVariable(<span class=\"hljs-string\">\"x\"<\/span>)),\n                    <span class=\"hljs-keyword\">new<\/span> NumberExpression(context.GetVariable(<span class=\"hljs-string\">\"y\"<\/span>))\n                )\n            )\n        );\n\n        <span class=\"hljs-keyword\">var<\/span> result = expression.Interpret(context);\n\n        Console.WriteLine(<span class=\"hljs-string\">\"Result: \"<\/span> + result); \n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Result: <span class=\"hljs-number\">110<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define the abstract class Expression:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define the <code>NumberExpression<\/code> class that inherits from the <code>Expression<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NumberExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">int<\/span> number;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">NumberExpression<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span> number<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">this<\/span>.number = number;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> number;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>NumberExpression<\/code> serves as a <code>TerminalExpression<\/code>.<\/p>\n\n\n\n<p>Third, define the <code>AddExpression<\/code> class that sums up two expressions:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AddExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">AddExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) + _right.Interpret(context);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>AddExpression<\/code> serves as a <code>NonterminalExpression<\/code>.<\/p>\n\n\n\n<p>Fourth, define the <code>SubtractExpression<\/code>, <code>MultiplyExpression<\/code>, and <code>DivideExpression<\/code> classes like the <code>AddExpression<\/code> class but subtract, multiply, and divide two numbers respectively.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubtractExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">SubtractExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) - _right.Interpret(context);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MultiplyExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MultiplyExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) * _right.Interpret(context);\n    }\n}\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DivideExpression<\/span> : <span class=\"hljs-title\">Expression<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _left;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Expression _right;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">DivideExpression<\/span>(<span class=\"hljs-params\">Expression leftExpression, Expression rightExpression<\/span>)<\/span>\n    {\n        _left = leftExpression;\n        _right = rightExpression;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Interpret<\/span>(<span class=\"hljs-params\">Context context<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">return<\/span> _left.Interpret(context) \/ _right.Interpret(context);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Fifth, define the Context class that maintains a dictionary of variables for the expression:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Context<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">int<\/span>&gt; _variables;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Context<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        _variables = <span class=\"hljs-keyword\">new<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">int<\/span>&gt;();\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SetVariable<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> name, <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-keyword\">value<\/span><\/span>)<\/span>\n    {\n        _variables&#91;name] = <span class=\"hljs-keyword\">value<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">GetVariable<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> name<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">if<\/span> (_variables.TryGetValue(name, <span class=\"hljs-keyword\">out<\/span> <span class=\"hljs-keyword\">var<\/span> <span class=\"hljs-keyword\">value<\/span>))\n        {\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">value<\/span>;\n        }\n        <span class=\"hljs-keyword\">else<\/span>\n        {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">$\"Variable '<span class=\"hljs-subst\">{name}<\/span>' not found.\"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, define the Client that composes the expression: 10 + 20 * (x + y), where x is 2 and y is 3:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Client<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> context = <span class=\"hljs-keyword\">new<\/span> Context();\n        context.SetVariable(<span class=\"hljs-string\">\"x\"<\/span>, <span class=\"hljs-number\">2<\/span>);\n        context.SetVariable(<span class=\"hljs-string\">\"y\"<\/span>, <span class=\"hljs-number\">3<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ -&gt; 10 + 20*(x + y)<\/span>\n        <span class=\"hljs-keyword\">var<\/span> expression = <span class=\"hljs-keyword\">new<\/span> AddExpression(\n            <span class=\"hljs-keyword\">new<\/span> NumberExpression(<span class=\"hljs-number\">10<\/span>),\n            <span class=\"hljs-keyword\">new<\/span> MultiplyExpression(  \n                <span class=\"hljs-keyword\">new<\/span> NumberExpression(<span class=\"hljs-number\">20<\/span>),\n                <span class=\"hljs-keyword\">new<\/span> AddExpression(\n                    <span class=\"hljs-keyword\">new<\/span> NumberExpression(context.GetVariable(<span class=\"hljs-string\">\"x\"<\/span>)),\n                    <span class=\"hljs-keyword\">new<\/span> NumberExpression(context.GetVariable(<span class=\"hljs-string\">\"y\"<\/span>))\n                )\n            )\n        );\n\n        <span class=\"hljs-keyword\">var<\/span> result = expression.Interpret(context);\n\n        Console.WriteLine(<span class=\"hljs-string\">\"Result: \"<\/span> + result); \n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the interpreter pattern to build an interpreter for a simple language.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1788\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-interpreter-pattern\/\"\n\t\t\t\tdata-post-title=\"C# Interpreter Pattern\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1788\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-interpreter-pattern\/\"\n\t\t\t\tdata-post-title=\"C# Interpreter Pattern\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you will learn how to use the C# interpreter pattern to interpret a language.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1441,"menu_order":12,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1788","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=1788"}],"version-history":[{"count":3,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1788\/revisions"}],"predecessor-version":[{"id":1797,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1788\/revisions\/1797"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1441"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=1788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}