<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 超越巔峰 閱讀(1246) 評論(1)  編輯  收藏 所屬分類: DSL

    評論

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

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


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(12)

    隨筆分類(54)

    隨筆檔案(59)

    文章分類(2)

    文章檔案(1)

    相冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 91久久成人免费| 久久青青草原国产精品免费| 99精品视频在线观看免费专区| 亚洲AV无码成人精品区大在线| 亚洲国产成人99精品激情在线| 亚欧免费视频一区二区三区| 亚洲日本在线观看| 99久久99热精品免费观看国产| 亚洲VA中文字幕不卡无码| 最近更新免费中文字幕大全| 中文字幕第13亚洲另类| a毛片全部播放免费视频完整18| 亚洲中文久久精品无码| 视频免费在线观看| 亚洲人成电影在线天堂 | 亚洲一本到无码av中文字幕| 久久久久久精品免费免费自慰| 亚洲酒色1314狠狠做| 亚洲国产一级在线观看 | 国产成人综合亚洲AV第一页 | 91在线视频免费播放| 亚洲日本一线产区和二线产区对比| 毛片a级毛片免费观看品善网| 色天使亚洲综合在线观看| 一二三四视频在线观看中文版免费| 中文字幕亚洲精品无码| 狠狠久久永久免费观看| sihu国产精品永久免费| 久久精品亚洲综合| 中文字幕无码成人免费视频| 亚洲AV永久无码精品网站在线观看| 全部免费a级毛片| 久久福利青草精品资源站免费 | 2020天堂在线亚洲精品专区| 国产精品美女自在线观看免费| 中文字幕免费播放| 亚洲国产精品乱码在线观看97| a级成人毛片免费视频高清| 亚洲精品在线免费观看| 日韩成人在线免费视频| 91福利免费网站在线观看|