如果某一類問題一再的發生
解釋器模式的定義
定義語言的文法
示意案例:
解釋器這個模式在實際應用當中應用並不廣泛
解釋器模式的結構
模式所涉及的角色
注意
/// <summary>
/// 抽象表達式角色
/// </summary>
public abstract class Expression
{
/// <summary>
/// 漢字數字與阿拉伯數字數字的對應字典
/// </summary>
protected Dictionary<string
public Expression()
{
table
table
table
table
table
table
table
table
table
}
/// <summary>
/// 所有的具體表達式角色都需要實現的抽象方法
/// 這個方法為虛方法
/// </summary>
/// <param name=
public virtual void Interpret(Context context)
{
//如果要處理的字符串長度為
if (context
{
return ;
}
foreach (string key in table
{
int value = table[key];
if (context
{
context
context
break;
}
if (context
{
context
break;
}
if (context
{
return ;
}
}
}
/// <summary>
/// 取漢字數字單位
/// 個位數為空
/// 十位數為十
/// 百位數為百
/// 千位數為千
/// </summary>
/// <returns></returns>
public abstract string GetPostifix();
/// <summary>
/// 例如:個位上數字為
/// 例如:百位上數字為
/// </summary>
/// <returns></returns>
public abstract int Multiplier();
/// <summary>
/// 例如:個位的長度為一位
/// 例如數字三十
/// 例如四百
/// </summary>
/// <returns></returns>
public virtual int GetLength()
{
return this
}
}
說明
/// <summary>
/// 終結符表達式角色
/// 如果能換算成數字則直接換算後返回
/// </summary>
class TerminalExpression : Expression
{
/// <summary>
/// 重寫解釋方法
/// </summary>
/// <param name=
public override void Interpret(Context context)
{
int i =
try
{
i = int
//如果是數字則說明能夠直接轉換
//也就是說用不到非終結表達式角色
context
context
}
catch
{
//說明輸入的是漢字數字
}
}
public override string GetPostifix()
{
return
}
public override int Multiplier() { return
}
注意
/// <summary>
/// 非終結表達式角色
/// 解釋個位數
/// </summary>
public class NonterminalOneExpression : Expression
{
public override string GetPostifix()
{
return
}
public override int Multiplier() { return
public override int GetLength()
{
return
}
}
/// <summary>
/// 非終結表達式角色
/// 解釋十位數
/// </summary>
public class NonterminalTenExpression : Expression
{
public override string GetPostifix()
{
return
}
public override int Multiplier() { return
public override int GetLength()
{
return
}
}
/// <summary>
/// 非終結表達式角色
/// 解釋百位數
/// </summary>
public class NonterminalHundredExpression : Expression
{
public override string GetPostifix()
{
return
}
public override int Multiplier() { return
public override int GetLength()
{
return
}
}
/// <summary>
/// 非終結表達式角色
/// 解釋千位數
/// </summary>
public class NonterminalThousandExpression : Expression
{
public override string GetPostifix()
{
return
}
public override int Multiplier() { return
public override int GetLength()
{
return
}
}
string roman =
Context context = new Context(roman);
//構造抽象語法樹
ArrayList tree = new ArrayList();
//加入終結符表達式
//如果能直接轉換成數字則直接返回
tree
//非終結符
tree
//非終結符
tree
//非終結符
tree
//非終結器
tree
//對抽象語法樹的每個枝節進行解釋操作
foreach (Expression exp in tree)
{
exp
}
Console
/// <summary>
/// 環境角色
/// </summary>
public class Context
{
/// <summary>
/// 漢字表示的數字
/// </summary>
public string statement
{
get;
set;
}
/// <summary>
/// 阿拉伯數字
/// </summary>
public int data
{
get;
set;
}
/// <summary>
/// 構造函數
/// 接受一個漢字表達式數字
/// </summary>
/// <param name=
public Context(string statement)
{
this
}
}
解釋器模式適用性
From:http://tw.wingwit.com/Article/program/net/201311/13348.html