說明器形式
明天和年夜家分享的形式是說明器形式。
起首引見一下說明器形式合適處理哪類成績。
其實,說明器形式須要處理的成績是,假如一種特定類型的成績產生的頻率足夠高,那末能夠就值得將該成績的各個實例表述為一個簡略說話的句子。如許便可以構建一個說明器,該說明器經由過程說明這些句子來處理該成績。
就運用的例子來講,例如正則表達式就是它的一種詳細運用,說明器可認為正則表現界說一個文法,若何表現一個特定的正則表達式,和若何說明這個正則表達式。
說明器形式的類構造圖以下。
圖中的構造也比擬好懂得,說明器辦法籠統出一個同一的接口(AbstractExpression),於須要說明的內容(Context)做懂得耦,挪用時為詳細的說明器辦法傳入內容(Context)從而完成響應的說明功效。
那末說明器形式有甚麼利益呢?
其適用懂得釋器形式,就意味著可以很輕易地轉變和擴大文法,由於該形式應用類來表現文律例則,你可使用繼續來轉變或擴大該文法。也比擬輕易完成文法,由於界說籠統語法樹中各個節點的類的完成年夜體相似,這些類都易於直接編寫。
那末除之條件到的正則表達式這類運用以外,其適用處照樣很廣的,固然了重要照樣對文本的說明。
除利益,其實說明器形式照樣有缺乏的,說明器形式為文法中的每條規矩至多界說了一個類,是以包括很多規矩的文法能夠難以治理和保護。建議當文法異常龐雜時,應用其他的技巧如語法剖析法式或編譯器生成器來處置。
說了很多,上面用代碼簡略展現一下說明器形式的詳細完成。
完成
留意:本文一切代碼均在ARC情況下編譯經由過程。
Context類接口
#import <Foundation/Foundation.h>
@interface Context :NSObject
@property NSString *Input;
@property NSString *Output;
@end
Context類完成
#import "Context.h"
@implementation Context
@synthesize Input,Output;
@end
AbstractExpression類接口
#import <Foundation/Foundation.h>
@class Context;
@interface AbstractExpression:NSObject
-(void)Interpret:(Context*)context;
@end
AbstractExpression類完成
#import "AbstractExpression.h"
@implementation AbstractExpression
-(void)Interpret:(Context *)context{
return;
}
@end
TerminalExpression類接口
#import "AbstractExpression.h"
@interface TerminalExpression :AbstractExpression
@end
TerminalExpression類完成
#import "TerminalExpression.h"
@implementation TerminalExpression
-(void)Interpret:(Context *)context{
NSLog(@"終端說明器");
}
@end
NonterminalExpression類接口
#import "AbstractExpression.h"
@interface NonterminalExpression:AbstractExpression
@end
NonterminalExpression類完成
#import "NonterminalExpression.h"
@implementation NonterminalExpression
-(void)Interpret:(Context *)context{
NSLog(@"非終端說明器");
}
@end
Main辦法挪用
#import <Foundation/Foundation.h>
#import "Context.h"
#import "TerminalExpression.h"
#import "NonterminalExpression.h"
int main (int argc,const char * argv[])
{
@autoreleasepool{
Context *context = [[Contextalloc]init];
NSMutableArray*list = [[NSMutableArrayalloc]init];
[list addObject:[[TerminalExpressionalloc]init]];
[list addObject:[[NonterminalExpressionalloc]init]];
[list addObject:[[TerminalExpressionalloc]init]];
[list addObject:[[TerminalExpressionalloc]init]];
for (AbstractExpression *exp in list) {
[exp Interpret:context];
}
}
return 0;
}
好啦,下面這些代碼只是做了簡略的展現罷了。症結照樣要靈巧運用啊。
總結
說明器形式屬於類的行動型形式,描寫了若何為說話界說一個文法,若何在該說話中表現一個句子,和若何說明這些句子,這裡的“說話”是應用劃定格局和語法的代碼。說明器形式重要用在編譯器中,在運用體系開辟中很罕用到。
長處:
1)輕易修正並擴大語法。
2)更輕易完成語法。
應用場景:
1)說話的語法比擬簡略。
2)效力其實不是最重要的成績。
【iOS App設計形式開辟中對interpreter說明器形式的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!