日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产三级在线免费观看 | 欧美生活一级片 | 日本一区成人 | 久热只有精品 | 欧美另类色 | 三级成人 | 国产资源视频 | av中文字幕在线免费观看 | 老司机午夜性大片 | 国产日韩欧美综合 | 黑人与日本少妇高潮 | 韩国三级中文字幕hd浴缸戏 | 福利国产视频 | 国产裸体永久免费视频网站 | 亚洲美免无码中文字幕在线 | 人妻视频一区 | 国产精品亚洲一区二区三区在线观看 | 岛国裸体写真hd在线 | 成人超碰在线 | 91干视频| 成人av网址在线 | 日本精品一区二区在线观看 | 国产精品一级黄片 | 视色视频在线观看 | 日韩午夜网站 | 国产情侣在线播放 | 麻豆app在线观看 | 毛片2 | 欧美a性 | 亚洲卡一卡二卡三 | 国产精品久久久久久吹潮 | 少妇色综合 | 6090伦理 | 91视频在线免费观看 | 国产美女被遭强高潮免费网站 | 欧美在线免费观看视频 | 国产高清视频在线免费观看 | 精品人妻一区二区三区日产乱码 | 美女扒开腿让男人操 | www操操操 | 成年人免费观看视频网站 | 精品欧美乱码久久久久久 | 久爱视频在线观看 | 成人做爰视频www网站小优视频 | av大帝在线观看 | 欧美人与性动交xxⅹxx | 国产又粗又猛又爽又黄的 | 免费日韩网站 | 欧美性猛交xxxx乱 | 日韩av无码中文字幕 | 亚洲性大片 | 欧美大片免费观看网址 | 国产日韩久久久 | 久久精品久 | 亚洲视频黄 | 欧美视频一二三 | 日韩一区二区三区四区 | 天天摸天天碰天天爽天天弄 | 日本在线播放视频 | 青青草国产成人av片免费 | 色婷婷激情综合 | 国产成人精品一区二区三区网站观看 | 影音先锋制服 | 亚洲第一页综合 | 另类老妇性bbwbbw图片 | 亚洲AV成人无码久久精品巨臀 | 精品国产精品国产偷麻豆 | 毛片一级片 | 青青在线观看视频 | 99精品福利 | 亚洲一级淫片 | 成人做爰免费视频免费看 | 中出精品 | 丰满少妇在线观看资源站 | 国产aaaaa毛片 | 人人干在线| 污的视频在线观看 | 成人a在线| 成人黄网免费观看视频 | 久久精品www人人爽人人 | 日韩精品卡通动漫网站 | 婷婷亚洲综合 | 黄色大片视频 | 国产精品一区二区久久国产 | 国产强被迫伦姧在线观看无码 | 欧美久久久久久久久久久久久久 | 黄色免费片 | 国产精品污 | 女人久久 | 777奇米色 | 毛茸茸日本熟妇高潮 | www三级免费 | 久久这里有精品 | 2021中文字幕| 在线成人亚洲 | 性感美女在线观看 | 99小视频 | 热久久在线 | 一区二区三区视频免费观看 |