📄 interpreterrealworld.cs
字号:
using System;
using System.Windows.Forms;
using System.Collections;
//解释器模式(Interpreter pattern)
//意图
// 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
//适用性
// 1.当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
// 而当存在以下情况时该模式效果最好:
// a.该文法简单 -- 对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。
// 它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
// b.效率不是一个关键问题 -- 最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。
// 例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
namespace DesignPattern.InterpreterRealWorld
{
class InterpreterRealWorld : AbstractPattern
{
public static void Run(TextBox tbInfo)
{
s_tbInfo = tbInfo;
s_tbInfo.Text = "";
string roman = "MCMXXVIII";
Context context = new Context(roman);
// Build the 'parse tree'
ArrayList tree = new ArrayList();
tree.Add(new ThousandExpression());
tree.Add(new HundredExpression());
tree.Add(new TenExpression());
tree.Add(new OneExpression());
// Interpret
foreach (Expression exp in tree)
{
exp.Interpret(context);
}
DesignPattern.FormMain.OutputInfo("{0} = {1}", roman, context.Output);
// Wait for user
//Console.Read();
}
}
// "Context"
class Context
{
private string input;
private int output;
// Constructor
public Context(string input)
{
this.input = input;
}
// Properties
public string Input
{
get
{
return input;
}
set
{
input = value;
}
}
public int Output
{
get
{
return output;
}
set
{
output = value;
}
}
}
// "AbstractExpression"
abstract class Expression
{
public void Interpret(Context context)
{
if (context.Input.Length == 0)
return;
if (context.Input.StartsWith(Nine()))
{
context.Output += (9 * Multiplier());
context.Input = context.Input.Substring(2);
}
else if (context.Input.StartsWith(Four()))
{
context.Output += (4 * Multiplier());
context.Input = context.Input.Substring(2);
}
else if (context.Input.StartsWith(Five()))
{
context.Output += (5 * Multiplier());
context.Input = context.Input.Substring(1);
}
while (context.Input.StartsWith(One()))
{
context.Output += (1 * Multiplier());
context.Input = context.Input.Substring(1);
}
}
public abstract string One();
public abstract string Four();
public abstract string Five();
public abstract string Nine();
public abstract int Multiplier();
}
// Thousand checks for the Roman Numeral M
// "TerminalExpression"
class ThousandExpression : Expression
{
public override string One()
{
return "M";
}
public override string Four()
{
return " ";
}
public override string Five()
{
return " ";
}
public override string Nine()
{
return " ";
}
public override int Multiplier()
{
return 1000;
}
}
// Hundred checks C, CD, D or CM
// "TerminalExpression"
class HundredExpression : Expression
{
public override string One()
{
return "C";
}
public override string Four()
{
return "CD";
}
public override string Five()
{
return "D";
}
public override string Nine()
{
return "CM";
}
public override int Multiplier()
{
return 100;
}
}
// Ten checks for X, XL, L and XC
// "TerminalExpression"
class TenExpression : Expression
{
public override string One()
{
return "X";
}
public override string Four()
{
return "XL";
}
public override string Five()
{
return "L";
}
public override string Nine()
{
return "XC";
}
public override int Multiplier()
{
return 10;
}
}
// One checks for I, II, III, IV, V, VI, VI, VII, VIII, IX
// "TerminalExpression"
class OneExpression : Expression
{
public override string One() { return "I"; }
public override string Four(){ return "IV";}
public override string Five(){ return "V"; }
public override string Nine(){ return "IX";}
public override int Multiplier() { return 1; }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -