|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。Java向来是一种以稳定应万变的言语。在Java5中,annotation的引进使得Java在某些特别的使用场所(如企业使用)中可以举行定制。Annotations可被看做是用Java中心手艺来界说的"范畴特定言语"(DomainSpecificLanguages,DSLs)。
Annotation实质上是一种name-value情势的绑定,仅限于它们所能表达的意义。它们不克不及界说新的语法布局,比方为collection增添个"select"。现实上annotations的存在展现了Java自己必要DSL的兼容,可是却缺少可以完整完成DSL所需要的丰厚性。
在这里我们为使Java可以撑持自界说语义给出了一些倡议和计划。假如可以举行一些得当的"扩大"(extension),在不与现有的语法抵触的情形下而且保存向后兼容。比方:用一些语法界说类来发生新的语法布局,临时称之为"语义类",如许就可以够以现无方式在程序中得以完成。我们把这个计划称之:XJ(eXtensibleJava,可扩大Java)。
XJ给Java带来了这个所谓的"语义类"。一个语义类也是一个有一般语法的的Java类,当Java剖析器碰到由语义类界说的语法布局,那末就用语义类中界说的语法来处置这些输出信息。假如剖析乐成,那这些语法能够分解为一个Java笼统语法树(AST:abstractsyntaxtree)。一个笼统语法树能够有一个尺度接口被Java编译器所利用当处置语法的时分。AST的新范例能够经由过程完成符合的接口来举行创立。
思索到JAVA中的一个复杂言语布局:根据某些前提从一个collection当选一个元素出来。一个利用新布局的例子以下所示:
Java代码
<br>
- importlanguagemylang.Select;
- publicPersongetChild(Vector<Person>people){
- @SelectPersonpfrompeoplewherep.age<18{
- returnp;
- }
- else{returnnull;}
- }
- importlanguagemylang.Select;publicPersongetChild(Vector<Person>people){@SelectPersonpfrompeoplewherep.age<18{returnp;}else{returnnull;}}
复制代码
这个新的语法接口能够叫做"Select",用"@"标记界说在语法类饮用的的前缀。界说了一个Vector从当选出前提为年事小于18岁的人群。最初前往满意前提的值,大概前往空值。Select的语法界说以下。
Java代码
<br>
- publicPersongetChild(Vector<Person>people){
- for(inti=0;i<people.size();i++){
- Personp=people.elementAt(i);
- if(p.age<18)
- returnp;
- }
- returnnull;
- }
- publicPersongetChild(Vector<Person>people){for(inti=0;i<people.size();i++){Personp=people.elementAt(i);if(p.age<18)returnp;}returnnull;}
复制代码
同理,经由过程XJ,一个新的语法接口经由过程界说语义类来界说。一个语义类包含语法由Java剖析器来处置详细的程序语法而且前往一个AST。一旦一个语义类被界说,它就可以经由过程在语义界说标记"@"后界说从而在程序代码中被利用。select的布局界说以下:
Java代码
<br>
- packagemylang;
- importlanguagejava.syntax.Grammar;
- importjava.syntax.AST;
- importjava.syntax.Block;
- importjava.syntax.Context;
- importjava.syntax.Statement;
- importjava.syntax.Sugar;
- importjava.syntax.Type;
- importjava.syntax.Var;
- publicclassSelectextendsSugar{
- privateTypetype;
- privateVarvar;
- privateASTcollection;
- privateASTtest;
- privateBlockbody;
- privateBlockotherwise;
- publicSelect(TypeT,Stringn,ASTc,ASTt,Blockb,Blocko){
- type=T;
- var=newVar(n);
- collection=c;
- test=t;
- body=b;
- otherwise=o;
- }
- //SelectGrammardefinition
- @GrammarextendsStatement{
- Select::=
- T=Type
- n=Name
- "from"c=Exp
- "when"t=Exp
- b=Block
- o=("else"Block|{returnnewBlock();})
- {returnnewSelect(T,n,c,t,b,o);}.}
- //Desugartoproduceanabstractsyntaxtree
- publicASTdesugar(Contextcontext){
- Class<T>cType=context.getType(collection);
- if(isVector(cType))
- returndesugarVector(cType,contect);
- else//Morecases...
- }
- publicASTdesugarVector(Class<T>cType,Contextcontext){
- Vardone=context.newVar();
- Varcoll=context.newVar();
- return
- [|boolean<done>=false;
- <cType>coll=<collection>;
- for(inti=0;i<<coll>.size();i++){
- <underlyingType(cType)><var>=<coll>.elementAt(i);
- if(<test>){
- <done>=true;
- <body>;
- }
- }
- if(!<done>)
- <otherwise>;
- |];
- }
- }
- packagemylang;importlanguagejava.syntax.Grammar;importjava.syntax.AST;importjava.syntax.Block;importjava.syntax.Context;importjava.syntax.Statement;importjava.syntax.Sugar;importjava.syntax.Type;importjava.syntax.Var;publicclassSelectextendsSugar{privateTypetype;privateVarvar;privateASTcollection;privateASTtest;privateBlockbody;privateBlockotherwise;publicSelect(TypeT,Stringn,ASTc,ASTt,Blockb,Blocko){type=T;var=newVar(n);collection=c;test=t;body=b;otherwise=o;}//SelectGrammardefinition@GrammarextendsStatement{Select::=T=Typen=Name"from"c=Exp"when"t=Expb=Blocko=("else"Block|{returnnewBlock();}){returnnewSelect(T,n,c,t,b,o);}.}//DesugartoproduceanabstractsyntaxtreepublicASTdesugar(Contextcontext){Class<T>cType=context.getType(collection);if(isVector(cType))returndesugarVector(cType,contect);else//Morecases...}publicASTdesugarVector(Class<T>cType,Contextcontext){Vardone=context.newVar();Varcoll=context.newVar();return[|boolean<done>=false;<cType>coll=<collection>;for(inti=0;i<<coll>.size();i++){<underlyingType(cType)><var>=<coll>.elementAt(i);if(<test>){<done>=true;<body>;}}if(!<done>)<otherwise>;|];}}
复制代码
从Select的语律例则界说能够看到一个优秀格局的语句是经由过程一个称号,关头字"from"及其表达式,关头字"when"及其表达式,和界说select块的注释。在注释后,还能够界说if-else之类的可选关头字。在select划定规矩中的每一个case中,剖析元素发生一个能够和称号可选联系关系的值。比方,和称号为"T"相干联的范例。别的,剖析划定规矩也包括前往值的Java语句。这些包括在{and}中,并且能够援用任安在前面界说的称号。由Selectrule前往终极了局是Select类的一个实例。
由语法所决意的前往值必需是java.syntax.AST类的一个实例。假如前往值是尺度JavaAST类的实例,那在语法类中不必要做特别处置。假如前往值是自界说语法类的实例,那末这个类必需完成AST接口,出处编译器翻译成JavaVM辨认的代码。更复杂易行的举措是用户自界说语义类从java.syntax.Sugar承继,而java.syntax.Sugar经由过程desugar办法完成了AST接口。desugar办法卖力把输出的信息注释为接口中已界说的AST(笼统语法树),
在这篇漫笔中我们先容了Java的扩大(XJ),次要是经由过程界说新的Java语法来对Java言语自己举行扩大。固然XJ还没有在Java中完成,可是它是XMF言语的次要特性。XMF言语已在贸易工具(XMF-Mosaic)中被利用并在2008年开源。关于本文更多的细节和例子能够参照这篇文章:超出Annotations:可扩大Java言语的企图。来自:http://www.javaeye.com/news/1924
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 |
|