<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    J2EE之巔

     

    DSL的實現要點(2)

     

    實現外部DSL

    與上一篇中所提及內部DSL不同,使用者不是通過API調用來使用DSL,而是通過我們定義的特定語法的領域語言來使用DSL

    1 XML形式的DSL

    腳本文件

    <process name="Auto-Door">

          <state name="Open">

                <transition event="time-out" next_state="Close"/>

          </state>

          <state name="Close">

                <transition event="people-closer" next_state="Open"/>

          </state>         

    </process>

    實現

    publicclass XmlConfigParser {

          //followings are context variables

          private Machine currentMachine;

          private State currentState;

          class ElementHandler extends DefaultHandler{

                private String getAttributeValue(String elemName,String attributeName,Attributes attris){

                      String attrValue=attris.getValue(attributeName);

                      if (attrValue==null){

                            thrownew XmlConfigParseException("Element "+elemName+" shoudle have the attribute:"+attributeName);

                      }

                      return attrValue;

                }

                @Override

                publicvoid endElement(String arg0, String arg1, String elemName)

                throws SAXException {

                      if (elemName.equals("state")){

                            currentMachine.getStates().add(currentState);

                      }

                }

                @Override

                publicvoid startElement(String arg0, String arg1, String elemName,

                            Attributes attris) throws SAXException{              

                      if (elemName.equals("process")){

                            String processName=getAttributeValue(elemName,"name",attris);

                            currentMachine=new Machine(processName);

                      }

                      if (elemName.equals("state")){

                            String stateName=getAttributeValue(elemName,"name",attris);

                            currentState=new State(stateName);

                      }

                      if (elemName.equals("transition")){

                            String eventName=getAttributeValue(elemName,"event",attris);

                            String nextState=getAttributeValue(elemName,"next_state",attris);

                            Transition transition=new Transition();

                            transition.setEvent(new Event(eventName));

                            transition.setNextState(nextState);

                            currentState.getTransitions().add(transition);

                      }

                }

          }

          public Machine parser(String fileName){

                SAXParserFactory spfactory =

                     SAXParserFactory.newInstance();                 

                           

                try{

                 SAXParser saxParser =

                           spfactory.newSAXParser();

                 XMLReader reader=saxParser.getXMLReader();

                 reader.setContentHandler(new ElementHandler());

                 reader.parse(fileName);                 

                 returncurrentMachine;

                }catch(Exception e){          

                 thrownew XmlConfigParseException("parsing is failed",e);

                }    

          }

    }

    實現要點

    上述實現是通過SAX來進行XML解析的。

    1 將領域模型結構直接映射為XML元素的結構

    我們用這種方式來設計我們的DSL,這樣做的好處是DSL比較容易使用(更接近領域模型),同時解析程序也會相對簡單,比較容易生成相應的語義模型。

    2 使用上下文變量

    如上面程序中的:

    private Machine currentMachine;

    private State currentState;

    他們就是上下文變量,由于SAX是順序解析的,所以必須保持正確的工作上下文,如把生產Transition對象加入到正確的State中。

    2 自定義語言

    腳本文件

    Machine   (Auto-Door){

                   State(Open){

                                  Transition{

                                                 event : time-out ,

                                                 next-state : Close

                                  }             

                   }

                   State (Close){

                                  Transition{

                                                 event : people-closer ,

                                                 next-state : Open

                                  }

                   }

    }

    實現

    自己設計語法并實現解析器,通常需要我們具備一定的編譯原理知識并且借用一定的解析器生成工具來幫助我們生產解析器代碼。

    實現中本人使用了 Antlr

    Antlr的語法描述文件:

    grammar StateMachineG;

    @header {

    import org.ccsoft.statemachine.models.Machine;

    import org.ccsoft.statemachine.models.State;

    import org.ccsoft.statemachine.models.Transition;

    import org.ccsoft.statemachine.models.Event;

    }

    @members {

                   public void emitErrorMessage(String msg) {

                                  throw new RuntimeException(msg);

                                  //super.emitErrorMessage(msg);

                   }

    }

    machine returns [Machine value]               :              'Machine''('NAME')''{'{$value=new Machine($NAME.text);} (e=state{$value.getStates().add($e.value);})+'}';

    state returns [State value]             :              'State''('NAME')''{'{$value=new State($NAME.text);}(e=transition{$value.getTransitions().add($e.value);})+'}';

    transition returns [Transition value]

                   :              'Transition''{'{$value=new Transition();}e=event{$value.setEvent($e.value);}','f=nextState{$value.setNextState($f.value);}'}';

    event     returns [Event value] :     'event'':'e=NAME{$value=new Event($NAME.text);};

    nextState returns [String value]

                   :              'next-state'':'e=NAME{$value=$NAME.text;};

    NAME    :              ('a'..'z' |'A'..'Z'|'0'..'9')+   ;

    WS : (' ' |'"t' |'"n' |'"r' )+ {skip();} ;

    實現要點

    1 采用Antlr的內嵌Action

    對于DSL的通常應用即通過外部腳本生產相關部分語義模型對象,使用Antlr的內嵌Action比采用語法樹方式簡單得多。

    posted on 2009-08-25 16:24 超越巔峰 閱讀(1245) 評論(1)  編輯  收藏 所屬分類: DSL

    評論

    # re: DSL的實現要點(2) 2009-08-25 17:09 長生界

    帥哥你排個版啊  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(12)

    隨筆分類(54)

    隨筆檔案(59)

    文章分類(2)

    文章檔案(1)

    相冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲啪啪AV无码片| 亚洲AV蜜桃永久无码精品| 亚洲色自偷自拍另类小说| 小说专区亚洲春色校园| 免费大香伊蕉在人线国产| 久久亚洲中文无码咪咪爱| 免费a级黄色毛片| 青娱乐在线视频免费观看| 免费a级毛片视频| 在线免费视频你懂的| 国产亚洲真人做受在线观看| 黄色视频在线免费观看| 亚洲AV区无码字幕中文色| 猫咪免费人成网站在线观看| 久久亚洲精品专区蓝色区| 香蕉高清免费永久在线视频| 美女扒开尿口给男人爽免费视频| 久久精品亚洲福利| 国产一精品一av一免费爽爽 | 免费女人18毛片a级毛片视频| 免费又黄又爽又猛大片午夜| 亚洲一级特黄无码片| 99精品视频在线视频免费观看| 亚洲成年人电影网站| 尤物永久免费AV无码网站| av午夜福利一片免费看久久| 久久精品国产亚洲AV大全| 韩国免费三片在线视频| 你懂的网址免费国产| 久久久久精品国产亚洲AV无码| 日本免费人成视频播放| 人妻免费一区二区三区最新| 亚洲午夜久久久精品电影院| 又粗又硬免费毛片| 香蕉成人免费看片视频app下载| 亚洲一区二区三区免费观看 | 亚洲精品视频观看| 大胆亚洲人体视频| 最近中文字幕大全免费视频| 国产精品亚洲精品日韩动图| 久久久久亚洲AV片无码|