费立国+顾卫华+蒋和超
摘 要:伴随着计算机产业的快速发展,成本和效率成为下一步前进的制约因素。当前多数计算机语言之间受到平台的束缚而不能相互通信,或依赖于操作系统,或依赖于硬件,若要求平台迁移或数据迁移,不仅给编程人员带来很大的不便,更降低了开发的效率,使生产受到限制。XML语言由于本身的优势,能够表示程序的结构信息,所以考虑用XML语言表示程序结构来实现各种编程语言之间的转换是可行的。
关键词:编程语言 JavaCC 转换 XML 旅行者模式
中图分类号:TP313 文献标识码:A 文章编号:1674-098X(2014)10(c)-0044-02
该文主要完成以下工作:选定某种编程语言相对应的.jj和.jjt文件,利用JavaCC工具建立该语言的编译器和抽象语法树,并依据它对抽语法树各节点类型添加语义动作和接受方法,建立抽象旅行者和具体旅行者,建立可以完成转换的驱动程序,编译后得到可执行的转换器。
1 应用主要技术及原理简介
(1) JavaCC简介。
JavaCC英文全称是(Java Compiler Compiler)是在扩展了YACC的基础上,使用Java语言开发的词法语法分析器。
JavaCC主要有以下功能:
①JavaCC用来处理语法文件(jj)生成解析代码。
②JJTree用来处理jjt文件,生成树节点代码和jj文件。
③JJDoc根据jj文件,生成文本本件(Html)。
(2)AST的基本结构。
抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是对编程语言源程序的语法结构的一种树形表示形式。语法树上的每一个节点都代表了一种结构。每个节点代表了一个非终终结符。每个具体的单词(由此法分析得到的)都在一个叶子节点上。根据抽象语法树的定义及规则,可以得到这个语句对应的语法树。
(3)XML语言简介。
XML语言的全称是Extensible Markup Language,中文为可扩展标记语言,它允许开发人员根据自己的需求定义标签,可以将标签和内容有效的分离。XML更加看重于数据的存储形式和传输方式,且具有简单易用、可扩展性强、数据与其组织形式相互分离等优势。
(4)旅行者模式简介。
旅行者模式是作者根据本次研究经验结合大量的实际操作过程提出的一种新的行为型设计模式,这种模式可以对某个对象中各个节点元素进行不同的操作,可以在不改变各节点类的基础上定义作用于这些元素的操作。
旅行者模式的特点:
旅行者模式把程序对象应用的数据结构与作用在这种结构之上的操作相互分离开,使得操作不依赖于结构。
旅行者模式更加适用于结构相对固定但算法不稳定的问题的解决。
旅行者模式的优势在于新添操作方便。
旅行者模式的基本原理:
得到元语言的AST后,进一步对语法树中的每个节点生成一个抽象类(节点是在元语言的.jjt文件中定义的),接下来定义一个旅行者接口,实现这个接口的不同旅行者可以根据自己的需求对语法树中的各个节点进行操作,从而获取所需的信息。一般抽象旅行者类都要有若干个具体旅行者子类来继承,在所有的旅行者中都会有对应的所有节点的方法,这样选择了某个旅行者,然后在该旅行者中找到具体的节点进行操作,就可以完成提取所需信息的任务。
2 从元语言到XML语言的转换
该文以C语言为例向读者介绍如何将C语言转换成XML,至于其他编程语言到XML的转换可按照此法仿照完成。
2.1 总体分析
(1)定义C语言语法的.jjt文件,通过JavaCC工具生成C语言对应的抽象语法树和C语言的编译器。(2)添加相应的节点标记和一定的规范。(3)通过旅行者模式对其进行遍历和提取所需的信息。
此过程所对应的流程图如图1所示。
2.2 C语言到AST的实现
首先获得相应语言的.jjt文件。执行.jjt文件会生成七个文件。我们对其中的simple1.java进行编译就可以获得Simple1.jj所定义的语法的编译器。如果我们对C语言的.jj文件进行JavaCC操作就可以得到一个名为CParser.java的文件,对其进行编译就得到了C语言的编译器。
2.3 旅行者模式设计
(1)设计旅行者模式。
访问各个节点是通过旅行者实现的。添加旅行者的目的主要是为了从抽象语法树到XML文件的转换。为了便于以后的扩展和深入,需要设计抽象旅行者接口和实现该接口的旅行者适配器。为了完成不同的操作,还需要许多具体的旅行者角色。
由于C语言的AST是由JavaCC工具自动生成的,C语言的.jjt文件定义了该语法树的层次结构,故不需设计树的组织形式,只要设计旅行者模式,设计旅行者访问语法树的各个节点。
旅行者模式的设计中的角色作用见表1。
(2)创建旅行者。
针对AST中的各个节点来建立相对应的旅行者。本实例是将所有节点对应的访问者的travel方法在一个ToXmlTraveller类中实现,ToXmlTraveller类继承了旅行者适配器,这样就可以根据用户的需求(需要旅行者访问哪些节点)来对其travel方法编写代码,从而实现相应的功能。
下面给出在旅行者中对ASTInitializer类型节点的travel方法,其他的不同节点的travel方法的编写与此类似。
public Object travel(ASTInitializer node, Object data){endprint
node.childrenAccept(traveller, element);
return super.tarvel(node,data);
}
当旅行者访问某一结点的时候,就要有接受者来响应相应的动作。接收者是根据整个程序在运行时来匹配相应的旅行者的,每个节点的接受方法类似。
下面给出在旅行者中ASTInitializer类型节点对应的接受方法:
public Object jjtAccept(CParser Traveller traveller,Object data){
return traveller.travel(this, data);
}
(3)创建转换器。
至此,已经建立了C语言转为XML文档的基础架构,下面还需要一个驱动程序来触发整个程序的运行。下面是部分代码:
public static void main(String[] args){
...
//解析器开始语法分析,生成待测程序的AST,并获得TranslationUnit类型的根节点对象 TranslationUnit ast = cparser.TranslationUnit();
//生成traveller对象,调用travel方法访问所有AST节点
ToXmlTraveller.traveller = new ToXmlTravellor();
//根节点接受旅行者
ast.jjtAccept(traveller,null);
...//输出转换完成的信息}
驱动程序会根据filename这个源文件名开始生成AST文件,然后根据在各个节点中的travel所定义的方法来执行相应的动作,由jjtAccept来响应动作,从而完成规定的功能。生成相应的XML文件。
3 实例分析
(1)实例执行。
下面用一个实例来说明如何将C语言程序转为XML文档。以源程序Test.c为例,演示生成XML文件的过程。
Test.c程序代码如图2所示:
#include
int main(void)
{
printf(“helloworld!”);
return 0;
}
生成的XML文档如图2所示,文件转换的速度是很快。用户可以将源文件中想要的信息全部提出,只需在相应的节点处添加travel即可。生成的XML文档结构清晰,在对其进行处理的时候可以定义其中的节点信息,从而为下一步将其转换为其他编程语言打下了基础。
4 从XML转换为其他语言
由于该文重点在于将编程语言转换为XML文件,所以在此只对于XML转换为其他编程语言作简要介绍,有这种需求的读者可以按照此思路进行深入研究。
XML文档转为其他编程语言,是将文档按照匹配的XSLT(Extensible Stylesheet Language Transformation,扩展样式表转换语言)转化为特定语言。如图3所示。
5 结语
该研究完成了编程语言之间相互转换工作的前一部分,就是从某一编程语言到XML语言的转换。其中是以C语言为例,从获取.jj文件到最终生成XML文档做了详细的说明,其中也给出了每个过程的具体实现方法,至于其他语言转换成XML语言可以参照C语言的方法实现;而对于从XML文档到编程语言的实现该文只是给出了大体的思路,并没有具体的研究过程以及实现方式,有需要这可按本思路研究。
参考文献
[1] Yves Savourel,著.XML国际化和本地化开发[M].李二勇,译.北京:机械工业出版社,2002.
[2] 王万山.吉林大学硕士学术论文.从 Java语言到XML语言的转换[D].吉林大学硕士学术论文.
[3] https://javacc.dev.java.net/[EB/OL].endprint
node.childrenAccept(traveller, element);
return super.tarvel(node,data);
}
当旅行者访问某一结点的时候,就要有接受者来响应相应的动作。接收者是根据整个程序在运行时来匹配相应的旅行者的,每个节点的接受方法类似。
下面给出在旅行者中ASTInitializer类型节点对应的接受方法:
public Object jjtAccept(CParser Traveller traveller,Object data){
return traveller.travel(this, data);
}
(3)创建转换器。
至此,已经建立了C语言转为XML文档的基础架构,下面还需要一个驱动程序来触发整个程序的运行。下面是部分代码:
public static void main(String[] args){
...
//解析器开始语法分析,生成待测程序的AST,并获得TranslationUnit类型的根节点对象 TranslationUnit ast = cparser.TranslationUnit();
//生成traveller对象,调用travel方法访问所有AST节点
ToXmlTraveller.traveller = new ToXmlTravellor();
//根节点接受旅行者
ast.jjtAccept(traveller,null);
...//输出转换完成的信息}
驱动程序会根据filename这个源文件名开始生成AST文件,然后根据在各个节点中的travel所定义的方法来执行相应的动作,由jjtAccept来响应动作,从而完成规定的功能。生成相应的XML文件。
3 实例分析
(1)实例执行。
下面用一个实例来说明如何将C语言程序转为XML文档。以源程序Test.c为例,演示生成XML文件的过程。
Test.c程序代码如图2所示:
#include
int main(void)
{
printf(“helloworld!”);
return 0;
}
生成的XML文档如图2所示,文件转换的速度是很快。用户可以将源文件中想要的信息全部提出,只需在相应的节点处添加travel即可。生成的XML文档结构清晰,在对其进行处理的时候可以定义其中的节点信息,从而为下一步将其转换为其他编程语言打下了基础。
4 从XML转换为其他语言
由于该文重点在于将编程语言转换为XML文件,所以在此只对于XML转换为其他编程语言作简要介绍,有这种需求的读者可以按照此思路进行深入研究。
XML文档转为其他编程语言,是将文档按照匹配的XSLT(Extensible Stylesheet Language Transformation,扩展样式表转换语言)转化为特定语言。如图3所示。
5 结语
该研究完成了编程语言之间相互转换工作的前一部分,就是从某一编程语言到XML语言的转换。其中是以C语言为例,从获取.jj文件到最终生成XML文档做了详细的说明,其中也给出了每个过程的具体实现方法,至于其他语言转换成XML语言可以参照C语言的方法实现;而对于从XML文档到编程语言的实现该文只是给出了大体的思路,并没有具体的研究过程以及实现方式,有需要这可按本思路研究。
参考文献
[1] Yves Savourel,著.XML国际化和本地化开发[M].李二勇,译.北京:机械工业出版社,2002.
[2] 王万山.吉林大学硕士学术论文.从 Java语言到XML语言的转换[D].吉林大学硕士学术论文.
[3] https://javacc.dev.java.net/[EB/OL].endprint
node.childrenAccept(traveller, element);
return super.tarvel(node,data);
}
当旅行者访问某一结点的时候,就要有接受者来响应相应的动作。接收者是根据整个程序在运行时来匹配相应的旅行者的,每个节点的接受方法类似。
下面给出在旅行者中ASTInitializer类型节点对应的接受方法:
public Object jjtAccept(CParser Traveller traveller,Object data){
return traveller.travel(this, data);
}
(3)创建转换器。
至此,已经建立了C语言转为XML文档的基础架构,下面还需要一个驱动程序来触发整个程序的运行。下面是部分代码:
public static void main(String[] args){
...
//解析器开始语法分析,生成待测程序的AST,并获得TranslationUnit类型的根节点对象 TranslationUnit ast = cparser.TranslationUnit();
//生成traveller对象,调用travel方法访问所有AST节点
ToXmlTraveller.traveller = new ToXmlTravellor();
//根节点接受旅行者
ast.jjtAccept(traveller,null);
...//输出转换完成的信息}
驱动程序会根据filename这个源文件名开始生成AST文件,然后根据在各个节点中的travel所定义的方法来执行相应的动作,由jjtAccept来响应动作,从而完成规定的功能。生成相应的XML文件。
3 实例分析
(1)实例执行。
下面用一个实例来说明如何将C语言程序转为XML文档。以源程序Test.c为例,演示生成XML文件的过程。
Test.c程序代码如图2所示:
#include
int main(void)
{
printf(“helloworld!”);
return 0;
}
生成的XML文档如图2所示,文件转换的速度是很快。用户可以将源文件中想要的信息全部提出,只需在相应的节点处添加travel即可。生成的XML文档结构清晰,在对其进行处理的时候可以定义其中的节点信息,从而为下一步将其转换为其他编程语言打下了基础。
4 从XML转换为其他语言
由于该文重点在于将编程语言转换为XML文件,所以在此只对于XML转换为其他编程语言作简要介绍,有这种需求的读者可以按照此思路进行深入研究。
XML文档转为其他编程语言,是将文档按照匹配的XSLT(Extensible Stylesheet Language Transformation,扩展样式表转换语言)转化为特定语言。如图3所示。
5 结语
该研究完成了编程语言之间相互转换工作的前一部分,就是从某一编程语言到XML语言的转换。其中是以C语言为例,从获取.jj文件到最终生成XML文档做了详细的说明,其中也给出了每个过程的具体实现方法,至于其他语言转换成XML语言可以参照C语言的方法实现;而对于从XML文档到编程语言的实现该文只是给出了大体的思路,并没有具体的研究过程以及实现方式,有需要这可按本思路研究。
参考文献
[1] Yves Savourel,著.XML国际化和本地化开发[M].李二勇,译.北京:机械工业出版社,2002.
[2] 王万山.吉林大学硕士学术论文.从 Java语言到XML语言的转换[D].吉林大学硕士学术论文.
[3] https://javacc.dev.java.net/[EB/OL].endprint