﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-J2EE之巅-随笔分类-DSL</title><link>http://www.blogjava.net/chaocai/category/41392.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 06 Apr 2010 10:35:37 GMT</lastBuildDate><pubDate>Tue, 06 Apr 2010 10:35:37 GMT</pubDate><ttl>60</ttl><item><title>DSL实现要点(3)--利用脚本语言实现DSL</title><link>http://www.blogjava.net/chaocai/archive/2010/04/06/317576.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Tue, 06 Apr 2010 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2010/04/06/317576.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/317576.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2010/04/06/317576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/317576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/317576.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;由于脚本语言通常提供了更为简洁的语法及Java所不具有的一些新的语言特性（如：闭包，元编程等），所以在一些情况下可以创造出比Java程序更具有可读性的代码。另外，众多基于JVM的脚本语言也为与Java程序整合带来了便利。Client: 语义模型实例的调用者SemanticConcept: 语义模型定义,可以通过脚本语言或Java实现ModelBuilder: 语...&nbsp;&nbsp;<a href='http://www.blogjava.net/chaocai/archive/2010/04/06/317576.html'>阅读全文</a><img src ="http://www.blogjava.net/chaocai/aggbug/317576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2010-04-06 18:21 <a href="http://www.blogjava.net/chaocai/archive/2010/04/06/317576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DSL的实现要点(2)</title><link>http://www.blogjava.net/chaocai/archive/2009/08/25/292526.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Tue, 25 Aug 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2009/08/25/292526.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/292526.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2009/08/25/292526.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/292526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/292526.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">实现外部</span>DSL</p>
<p><span style="font-family: 宋体">与上一篇中所提及内部</span>DSL<span style="font-family: 宋体">不同，使用者不是通过</span>API<span style="font-family: 宋体">调用来使用</span>DSL<span style="font-family: 宋体">，而是通过我们定义的特定语法的领域语言来使用</span>DSL<span style="font-family: 宋体">。</span></p>
<p>1 XML<span style="font-family: 宋体">形式的</span>DSL</p>
<p><span style="font-family: 宋体">脚本文件</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">process </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Auto-Door"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">state </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Open"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">transition </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">event</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"time-out" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">next_state</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Close"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">/&gt;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">state</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">state </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Close"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">transition </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">event</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"people-closer" </span><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">next_state</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Open"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">/&gt;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">state</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; color: teal; line-height: 115%; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; line-height: 115%; font-family: 'Courier New'">process</span><span style="font-size: 10pt; color: teal; line-height: 115%; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">实现</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XmlConfigParser {</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//followings are context variables</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Machine </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentMachine</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> State </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentState</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> ElementHandler </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DefaultHandler{</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getAttributeValue(String elemName,String attributeName,Attributes attris){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String attrValue=attris.getValue(attributeName);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (attrValue==</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">throw</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XmlConfigParseException(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Element "</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+elemName+</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">" shoudle have the attribute:"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+attributeName);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> attrValue;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #646464; font-family: 'Courier New'">@Override</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> endElement(String arg0, String arg1, String elemName)</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">throws</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> SAXException {</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (elemName.equals(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"state"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentMachine</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.getStates().add(</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentState</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #646464; font-family: 'Courier New'">@Override</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> startElement(String arg0, String arg1, String elemName,</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attributes attris) </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">throws</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> SAXException{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (elemName.equals(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"process"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String processName=getAttributeValue(elemName,</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"name"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,attris);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentMachine</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Machine(processName);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (elemName.equals(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"state"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stateName=getAttributeValue(elemName,</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"name"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,attris);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentState</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> State(stateName);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (elemName.equals(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"transition"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String eventName=getAttributeValue(elemName,</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"event"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,attris);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nextState=getAttributeValue(elemName,</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"next_state"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,attris);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transition transition=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Transition();</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transition.setEvent(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Event(eventName));</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transition.setNextState(nextState);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentState</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.getTransitions().add(transition);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> <span style="background: silver">Machine</span> parser(String fileName){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParserFactory spfactory = </span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParserFactory.<em>newInstance</em>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">{</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SAXParser saxParser = </span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spfactory.newSAXParser();</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;XMLReader reader=saxParser.getXMLReader();</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;reader.setContentHandler(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> ElementHandler());</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;reader.parse(fileName);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; background: silver; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; background: silver; color: #0000c0; font-family: 'Courier New'">currentMachine</span><span style="font-size: 10pt; background: silver; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(Exception e){&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; background: silver; color: #7f0055; font-family: 'Courier New'">throw</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XmlConfigParseException(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"parsing is failed"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">,e);</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">实现要点</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">上述实现是通过</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">SAX</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">来进行</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">XML</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">解析的。</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">1 </span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">将领域模型结构直接映射为</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">XML</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">元素的结构</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">我们用这种方式来设计我们的</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">DSL</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">，这样做的好处是</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">DSL</span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">比较容易使用（更接近领域模型），同时解析程序也会相对简单，比较容易生成相应的语义模型。</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New'">2 </span><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">使用上下文变量</span></p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 宋体">如上面程序中的：</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Machine </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentMachine</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> State </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">currentState</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; color: black; font-family: 宋体">他们就是上下文变量，由于</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">SAX</span><span style="font-size: 10pt; color: black; font-family: 宋体">是顺序解析的，所以必须保持正确的工作上下文，如把生产</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Transition</span><span style="font-size: 10pt; color: black; font-family: 宋体">对象加入到正确的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">State</span><span style="font-size: 10pt; color: black; font-family: 宋体">中。</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; font-family: 'Courier New'">2 </span><span style="font-size: 10pt; font-family: 宋体">自定义语言</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 10pt; font-family: 宋体">脚本文件</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">Machine&nbsp;&nbsp; (Auto-Door){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State(Open){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transition{</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event : time-out ,</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next-state : Close</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State (Close){</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transition{</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event : people-closer ,</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next-state : Open</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif'">}</span></p>
<p><span style="font-family: 宋体">实现</span></p>
<p><span style="font-family: 宋体">自己设计语法并实现解析器，通常需要我们具备一定的编译原理知识并且借用一定的解析器生成工具来帮助我们生产解析器代码。</span></p>
<p><span style="font-family: 宋体">实现中本人使用了</span> Antlr</p>
<p>Antlr<span style="font-family: 宋体">的语法描述文件：</span></p>
<p>grammar StateMachineG;</p>
<p>@header {</p>
<p>import org.ccsoft.statemachine.models.Machine;</p>
<p>import org.ccsoft.statemachine.models.State;</p>
<p>import org.ccsoft.statemachine.models.Transition;</p>
<p>import org.ccsoft.statemachine.models.Event;</p>
<p>}</p>
<p>@members {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void emitErrorMessage(String msg) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException(msg);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //super.emitErrorMessage(msg);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>machine returns [Machine value]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Machine''('NAME')''{'{$value=new Machine($NAME.text);} (e=state{$value.getStates().add($e.value);})+'}';</p>
<p>state returns [State value]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'State''('NAME')''{'{$value=new State($NAME.text);}(e=transition{$value.getTransitions().add($e.value);})+'}';</p>
<p>transition returns [Transition value]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Transition''{'{$value=new Transition();}e=event{$value.setEvent($e.value);}','f=nextState{$value.setNextState($f.value);}'}';</p>
<p>event&nbsp;&nbsp;&nbsp;&nbsp; returns [Event value] :&nbsp;&nbsp;&nbsp;&nbsp; 'event'':'e=NAME{$value=new Event($NAME.text);};</p>
<p>nextState returns [String value]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'next-state'':'e=NAME{$value=$NAME.text;};</p>
<p>NAME&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ('a'..'z' |'A'..'Z'|'0'..'9')+&nbsp;&nbsp; ;</p>
<p>WS : (' ' |'"t' |'"n' |'"r' )+ {skip();} ;</p>
<p><span style="font-family: 宋体">实现要点</span></p>
<p>1 <span style="font-family: 宋体">采用</span>Antlr<span style="font-family: 宋体">的内嵌</span>Action</p>
<p><span style="font-family: 宋体">对于</span>DSL<span style="font-family: 宋体">的通常应用即通过外部脚本生产相关部分语义模型对象，使用</span>Antlr<span style="font-family: 宋体">的内嵌</span>Action<span style="font-family: 宋体">比采用语法树方式简单得多。</span></p>
<img src ="http://www.blogjava.net/chaocai/aggbug/292526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2009-08-25 16:24 <a href="http://www.blogjava.net/chaocai/archive/2009/08/25/292526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DSL的实现要点(1)</title><link>http://www.blogjava.net/chaocai/archive/2009/08/24/292397.html</link><dc:creator>超越巅峰</dc:creator><author>超越巅峰</author><pubDate>Mon, 24 Aug 2009 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/chaocai/archive/2009/08/24/292397.html</guid><wfw:comment>http://www.blogjava.net/chaocai/comments/292397.html</wfw:comment><comments>http://www.blogjava.net/chaocai/archive/2009/08/24/292397.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chaocai/comments/commentRss/292397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chaocai/services/trackbacks/292397.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;引言DSL(domain-specific language)并不是什么新的概念和技术，但是目前它已成为了一个技术热点，近期各种类型的技术交流或研讨会上你都可以看到关于DSL的主题。DSL似乎也在一夜间成为了大师们关注的焦点（Martin Fowler，Eric Evans等等）。应用DSL可以有效的提高系统的可维护性（缩小了实现模型和领域模型的距离，提高了实现的可读性）和...&nbsp;&nbsp;<a href='http://www.blogjava.net/chaocai/archive/2009/08/24/292397.html'>阅读全文</a><img src ="http://www.blogjava.net/chaocai/aggbug/292397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chaocai/" target="_blank">超越巅峰</a> 2009-08-24 15:45 <a href="http://www.blogjava.net/chaocai/archive/2009/08/24/292397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>