由正則表達式引申到解釋器模式

       平時我們經常會用到正則表達式來解釋我們輸入框的內容是否符合郵箱、電話號碼、身份證等。其他它就是對我們輸入的值進行一個個字符的校驗,當滿足的時候則返回True,否則返回False;這就是咱們今天要講的典型的解釋器模式。解釋器模式的應用不僅這些,在早年的非智能手機上,自己可以根據要求編寫出音樂的字符串,然後播放出音樂...

       我們來看看什麼是解釋器模式?給定義一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。換種方式理解:針對一個給定的表示,採用已經定義好的解釋器,翻譯成對應的句子。


代碼部分:

AbstractExpression 實際上抽象的解釋器類,所有的具體的解釋器都出這個地方繼承;

abstract class AbstractExpression
{
	public abstract void Interpret(Context context);
}

TerminalExpression是終端解釋器的的解釋方式;

class TerminalExpression:AbstractExpression
{
	public override void Interpret(Context context)
	{
		Console.WriteLine("終端解釋器");
	}
	
}


NorterminalExpression 是非終端的解釋方式,這個地方我們只寫了一個,如果有其他的解釋方式,直接重新定義一個新的具體類(繼承抽象類AbstractExpression)就可以了;

class NoTerminalExpression:AbstractExpression
{
	public override void Interpret(Context context)
	{
		Console.WriteLine("非終端解釋器");
	}
}


我們還有些全局變量需要傳入後進行 解釋,我們把解釋器和傳入的變量分開減少他們之間的耦合性;

//解釋器之外的一些全局數據
class Context
{
private string input;
public string Input
{
get{ return input;}
set{ input=value;}
}

private string output;
public string Output
{
get{ return output;}
set{ output=value;}
}
}

客戶端構建一個特定的抽象語法樹,並傳入全局變量進行解釋;

static void Main(string[] arg)
{
	Context context=new Context();
	//定義特定句子的語法樹
	IList<AbstractExpression> list=new List<AbstractExpression>();
	list.Add(new TerminalExpression());
	List.Add(new NoTerminalExpression());
	list.Add(new TerminalExpression());
	list.Add(new TerminalExpression());
	foreach(AbstractExpression exp in list)
	{
	    //根據傳入的全局變量,進行解釋
		exp.Interpret(context);
	}
}

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章