日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

《研磨设计模式》chap21 解释器模式Interpreter(2)parse模型

發(fā)布時(shí)間:2025/3/21 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《研磨设计模式》chap21 解释器模式Interpreter(2)parse模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 定義

讀取表達(dá)式,構(gòu)建抽象語法樹,葉子類,節(jié)點(diǎn)類,context上下文

step1:分解表達(dá)式,得到需要解析的元素名稱和該元素對(duì)應(yīng)的解析模型
step2:根據(jù)節(jié)點(diǎn)的屬性轉(zhuǎn)換成為相應(yīng)的解釋器對(duì)象
step3:組合抽象語法樹,一定要按照先后順序來組合,否則對(duì)象的包含關(guān)系就亂了

2.

2.1 第1步:分解表達(dá)式

/*** 按照從左到右順序來分解表達(dá)式,得到需要解析的元素名稱,* 還有該元素對(duì)應(yīng)的解析模型* @param expr 需要分解的表達(dá)式* @return 得到需要解析的元素名稱,還有該元素對(duì)應(yīng)的解析模型*/private static Map<String,ParserModel> parseMapPath(String expr){//先按照/分割字符串StringTokenizer tokenizer = new StringTokenizer(expr, BACKLASH);//初始化一個(gè)map用來存放分解出來的值Map<String,ParserModel> mapPath = new HashMap<String,ParserModel>();while (tokenizer.hasMoreTokens()) {String onePath = tokenizer.nextToken();if (tokenizer.hasMoreTokens()) {//還有下一個(gè)值,說明這不是最后一個(gè)元素//按照現(xiàn)在的語法,屬性必然在最后,因此也不是屬性setParsePath(false,onePath,false,mapPath);} else {//說明到最后了int dotIndex = onePath.indexOf(DOT);if (dotIndex > 0) {//說明是要獲取屬性的值,那就按照"."來分割,前面的就是元素名字,后面的是屬性的名字String eleName = onePath.substring(0, dotIndex);String propName = onePath.substring(dotIndex + 1);//設(shè)置屬性前面的那個(gè)元素,自然不是最后一個(gè),也不是屬性setParsePath(false,eleName,false,mapPath);//設(shè)置屬性,按照現(xiàn)在的語法定義,屬性只能是最后一個(gè)setParsePath(true,propName,true,mapPath);} else {//說明是取元素的值,而且是最后一個(gè)元素的值setParsePath(true,onePath,false,mapPath);}break;}}return mapPath;}/*** 按照分解出來的位置和名稱來設(shè)置需要解析的元素名稱,* 還有該元素對(duì)應(yīng)的解析模型* @param end 是否是最后一個(gè)* @param ele 元素名稱* @param propertyValue 是否是取屬性* @param mapPath 設(shè)置需要解析的元素名稱,還有該元素對(duì)應(yīng)的解析模型的Map對(duì)象*/private static void setParsePath(boolean end,String ele,boolean propertyValue,Map<String,ParserModel> mapPath){ParserModel pm = new ParserModel();pm.setEnd(end);//如果帶有$符號(hào)就說明不是一個(gè)值pm.setSingleVlaue(!(ele.indexOf(DOLLAR)>0));pm.setPropertyValue(propertyValue); //去掉$ele = ele.replace(DOLLAR, "");mapPath.put(ele,pm);listEle.add(ele);}

2.2 第2步:根據(jù)模型將元素轉(zhuǎn)換成解釋器對(duì)象

/*** 把分解出來的元素名稱,根據(jù)對(duì)應(yīng)的解析模型轉(zhuǎn)換成為相應(yīng)的解釋器對(duì)象* @param mapPath 分解出來的需要解析的元素名稱,還有該元素對(duì)應(yīng)的解析模型* @return 把每個(gè)元素轉(zhuǎn)換成為相應(yīng)的解釋器對(duì)象后的集合*/private static List<ReadXmlExpression> mapPath2Interpreter(Map<String,ParserModel> mapPath){List<ReadXmlExpression> list = new ArrayList<ReadXmlExpression>();//一定要按照分解的先后順序來轉(zhuǎn)換成解釋器對(duì)象for(String key : listEle){ParserModel pm = mapPath.get(key);ReadXmlExpression obj = null;if(!pm.isEnd()){if(pm.isSingleVlaue()){//不是最后一個(gè),是一個(gè)值,轉(zhuǎn)化為obj = new ElementExpression(key); }else{//不是最后一個(gè),是多個(gè)值,轉(zhuǎn)化為obj = new ElementsExpression(key);}}else{if(pm.isPropertyValue()){if(pm.isSingleVlaue()){//是最后一個(gè),是一個(gè)值,取屬性的值,轉(zhuǎn)化為obj = new PropertyTerminalExpression(key);}else{//是最后一個(gè),是多個(gè)值,取屬性的值,轉(zhuǎn)化為obj = new PropertysTerminalExpression(key);}}else{if(pm.isSingleVlaue()){//是最后一個(gè),是一個(gè)值,取元素的值,轉(zhuǎn)化為obj = new ElementTerminalExpression(key);}else{//是最后一個(gè),是多個(gè)值,取元素的值,轉(zhuǎn)化為obj = new ElementsTerminalExpression(key);}}}//把轉(zhuǎn)換后的對(duì)象添加到集合中l(wèi)ist.add(obj);}return list;}

2.3 第3步:組合抽象語法樹

private static ReadXmlExpression buildTree(List<ReadXmlExpression> list){//第一個(gè)對(duì)象,也是返回去的對(duì)象,就是抽象語法樹的根ReadXmlExpression returnRe = null;//定義上一個(gè)對(duì)象ReadXmlExpression preRe = null;for(ReadXmlExpression re : list){ if(preRe==null){//說明是第一個(gè)元素preRe = re;returnRe = re;}else{//把元素添加到上一個(gè)對(duì)象下面,同時(shí)把本對(duì)象設(shè)置成為oldRe,作為下一個(gè)對(duì)象的父結(jié)點(diǎn)if(preRe instanceof ElementExpression){ElementExpression ele = (ElementExpression)preRe;ele.addEle(re);preRe = re;}else if(preRe instanceof ElementsExpression){ElementsExpression eles = (ElementsExpression)preRe;eles.addEle(re);preRe = re;}}}return returnRe;} /*----------------------第三步實(shí)現(xiàn)結(jié)束-----------------------*/ }

總結(jié)

以上是生活随笔為你收集整理的《研磨设计模式》chap21 解释器模式Interpreter(2)parse模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一个色的综合 | 四川丰满少妇被弄到高潮 | 丰满少妇在线观看资源站 | free性中国hd国语露脸 | 久久久久久国产精品视频 | 黄色网战大全 | 韩国美女视频在线观看18 | av先锋在线 | 免费麻豆av| 美女18毛片 | 成人在线观看一区二区三区 | 午夜激情av在线 | 人人草av | 黄色av网址在线观看 | 日韩视频一区二区三区在线播放免费观看 | 日韩中文在线字幕 | 日本黄网站 | 亚洲一区成人 | 国产偷拍一区二区 | 在线免费黄网 | 超碰这里只有精品 | 国产裸体舞一区二区三区 | 国产精品视频专区 | 老汉av网站 | 在线视频天堂 | 亚洲一区二区三区三州 | 国产成人啪免费观看软件 | 一区一区三区产品乱码 | 亚洲蜜桃精久久久久久久久久久久 | 91香蕉国产在线观看 | 日毛片| 亚洲天堂一区二区在线观看 | 青青青草视频 | 国产精品国产三级国产普通话蜜臀 | 亚洲免费综合 | 亚洲妇熟xx妇色黄蜜桃 | 美女扒开腿让男人捅 | 日韩精品一区二区三 | 亚洲一区日韩 | 国产suv精品一区二区三区 | 欧美乱大交 | 四虎国产成人永久精品免费 | 爱情岛论坛亚洲品质自拍 | 国产区免费观看 | 国产成人一区二区三区 | 午夜av一区二区三区 | 91人人澡人人爽 | 国产精品一区二区视频 | 精品少妇人妻一区二区黑料社区 | 日韩精品电影在线 | 国产精品jizz在线观看老狼 | 爱爱免费网站 | 国产五十路 | 激情视频免费观看 | 999在线观看视频 | 青青草视频在线免费观看 | 四虎黄色网 | 天堂中文在线视频 | 波多野结衣一区二区三区四区 | 国产又爽又黄无码无遮挡在线观看 | 国产精品国产三级国产aⅴ原创 | 人人人超碰 | av资源部 | 日韩一区二区三区四区在线 | 五月婷婷网 | 可以免费观看的毛片 | 美女张开腿让男人桶爽 | 精品黄色一级片 | 999伊人| 成人做受黄大片 | 91.xxx.高清在线 | 中文字幕精品无 | 国产一区精品在线 | 国模婷婷 | 午夜剧场福利 | 四虎永久在线精品免费网址 | 欧美大黄 | 强行挺进皇后紧窄湿润小说 | 青娱乐导航 | 日韩成人在线视频观看 | 日本少妇在线 | 日噜 | 国产人澡人澡澡澡人碰视频 | 在线小视频你懂的 | 99re6在线 | 亚洲综合激情另类小说区 | 国产香蕉视频在线 | 亚洲国产精品成人va在线观看 | 少妇又紧又深又湿又爽视频 | 黄色片www | 教练含着她的乳奶揉搓揉捏动态图 | 扒开女人屁股进去 | 亚洲情趣| 操一操视频| 极品色av | 我要看一级黄色片 | 国产日产精品一区二区三区 | av在线播放网 | 亚洲午夜国产 |