专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java扩展:XJ: 一个扩展Java语言的方案 »正文

java扩展:XJ: 一个扩展Java语言的方案

来源: 发布时间:星期三, 2009年2月25日 浏览:0次 评论:0
JAVA中文站社区门户t h6V+W*`V!^ y"y
Java历来是种以不变应万变语言在Java 5中annotation引入使得Java在某些特殊应用场合(如企业应用)中能够进行定制Annotations 可被看作是用Java核心技术来定义"领域特定语言"(Do Specic Languages,DSLs)
YF9t3pLm;nzh r+WJAVA中文站社区门户+v\ Bs/L"K aH ~${,B
Annotation本质上是种 name-value 形式绑定仅限于它们所能表达意义它们不能定义新语法结构例如为collection增加个"select"事实上annotations存在揭示了Java本身需要DSL兼容但是却缺乏能够完全实现DSL所必要丰富性
4x!|d*p@u|iJAVA中文站社区门户A~ LY6k\@
在这里我们为使Java能够支持自定义语义给出了些建议和方案如果能够进行些适当"扩展"(extension)在不和现有语法冲突情况下并且保留向后兼容例如:用些语法定义类来产生新语法结构姑且称的为 "语义类"这样就能够以现有方式在中得以实现我们把这个方案称的: XJ (eXtensible Java,可扩展Java) JAVA中文站社区门户mU TeJ8~H5|(Q

8[#\Q;P:g#mXJ给Java带来了这个所谓"语义类"个语义类也是个有通常语法Java类当Java解析器遇到由语义类定义语法结构那么就用语义类中定义语法来处理这些输入信息如果解析成功那这些语法可以合成为个Java抽象语法树(AST:abstract syntax tree )个抽象语法树可以有个标准接口被Java编译器所使用当处理语法时候AST新类型可以通过实现合适接口来进行创建
8poC9{5e.U4pd!D
V!qW@;n``B [考虑到JAVA中个简单语言结构:依据某些条件从个collection中选个元素出来个使用新结构例子如下所示: JAVA中文站社区门户V0fq#\6y3z

maMU8~5HA lJava代码
5z7LO F6i-ZJAVA中文站社区门户f^,Da1FrR*@

"m"LH$X _e0Zi
  1. import language mylang.Select;
  2. JAVA中文站社区门户P7w3m-{6Q TZ:j
    public Person getChild(Vector<;Person> people) {

  3. :e+x]"k3u-^@Select Person p from people where p.age < 18 {

  4. 7Au$AF$i `4Im U p;
  5. }

  6. "~9JK ]#T?'A Q { JAVA中文站社区门户'u,K'?IT
    null; }
  7. }
    JAVA中文站社区门户hOj"J&\O7i#P9U`
    JAVA中文站社区门户S e N-m ^VhRP
    1. import language mylang.Select;
    2. JAVA中文站社区门户\A$d G r:t:NY;B'[
      public Person getChild(Vector<;Person> people) {

    3. +W*Ol)rB;B c;B(_@Select Person p from people where p.age < 18 {

    4. @AmN)c)C(WYW Z p;
    5. }

    6. I*c^%q;gu E-n.H/} { JAVA中文站社区门户(EZ6L+QN|0~
      null; }
    7. }
      JAVA中文站社区门户Y@5k&I(E2zx+nJ
      import language mylang.Select;public Person getChild(Vector<;Person> people) {  @Select Person p from people where p.age < 18 {    p;   }   { null; }}JAVA中文站社区门户:X_ {"^"ba:r4cM

      9~/cu b e8N8nd6OO m这个新语法接口可以叫做"Select",用"@"符号定义在语法类饮用前缀定义了个Vector从中选出条件为年纪小于18岁人群最后返回满足条件或者返回空值Select语法定义如下 JAVA中文站社区门户J}/ZT po
      JAVA中文站社区门户E-ef$a6H#W{:dDj
      Java代码
      *mEATJ$De%y;b
      $e6Pf%@n BLBZ:I s
      1. public Person getChild(Vector<;Person> people) {
      2. JAVA中文站社区门户Hqi2Ff;P
        for( i = 0; i < people.size; i) {
      3.   Person p = people.elementAt(i);

      4. 8x|-k%g;g:G(p.age < 18)

      5. t0_x(Ba p;
      6. }
      7. JAVA中文站社区门户W.g*\B9aN6U
        JAVA中文站社区门户}$F+ou@q;wy0W
        null;
      8. }
        JAVA中文站社区门户z#w1ed] oa8Kp
        JAVA中文站社区门户(g;r-F2@3xX

        gZA\ Zye4T
        1. public Person getChild(Vector<;Person> people) {

        2. ,fm4h` G&h9p5@ EKsfor( i = 0; i < people.size; i) {
        3.   Person p = people.elementAt(i);
        4. JAVA中文站社区门户hp;~^"i2{7w pX
          (p.age < 18)
        5. JAVA中文站社区门户 WeE0B/S#CnhM2g&D
          p;
        6. }

        7. 8pBo4].r!v7l
          %raD&X h;[M ?null;
        8. }

          N)WE1D!CI4t epublic Person getChild(Vector<;Person> people) {   for( i = 0; i < people.size; i) {      Person p = people.elementAt(i);      (p.age < 18)          p;   }    null;}JAVA中文站社区门户6h@!O!R9_C$K

          Md\x1A)a同理通过XJ个新语法接口通过定义语义类来定义个语义类包括语法由Java解析器来处理具体语法并且返回个AST个语义类被定义它就能通过在语义定义符号"@"后定义从而在代码中被使用select结构定义如下:
          L+i`-o9B6T k(rf)EJAVA中文站社区门户5E,_Bb3N)E)u0W
          Java代码 JAVA中文站社区门户2E B%q^4y4a z#Pe
          JAVA中文站社区门户,QFmH7MUMa
          1. package mylang;

          2. J*S&i/W]HN{wimport language java.syntax.Grammar;

          3. 8w"Tk7a.N'wa\ximport java.syntax.AST;

          4. yjTX)E Y pLimport java.syntax.Block;

          5. O;g;ni3n M[5H#k"Pimport java.syntax.Context;

          6. KyMt ~Fimport java.syntax.Statement;

          7. 0zM.B;B/o8q1gW1himport java.syntax.Sugar;
          8. JAVA中文站社区门户|GV\ B3e"HtH8W^
            import java.syntax.Type;

          9. 'y\y~$gB)hBX"}0Bimport java.syntax.Var;

          10. 7LD(`YZopublicJAVA中文站社区门户j%@ X)R3i&_
            Select extends Sugar {
          11. JAVA中文站社区门户&i-p'P p-K
            private Type type;

          12. t"{zG,b+L4wUprivate Var var;

          13. lO-r-fg"i qprivate AST collection;
          14. JAVA中文站社区门户.V mu0d&q%H*Pi_3~
            private AST test;
          15. JAVA中文站社区门户ft!NW0p6{;ZT+v
            private Block body;
          16. JAVA中文站社区门户 k4l0mJ4?mO#@d
            private Block otherwise;
          17. JAVA中文站社区门户0|d?A Mp%KN
            public Select(Type T,String n,AST c,AST t,Block b,Block o){
          18.     type = T;
          19.     var = Var(n);
          20.     collection = c;
          21.     test = t;
          22.     body = b;
          23.     otherwise = o;
          24.   }

          25. nQ0`3x7c$R q){// Select Grammar definition
          26. JAVA中文站社区门户 J/U bzS1q A?
            @Grammar
            F5^t!Gnf `5cextends Statement {
          27.     Select ::=
          28.       T = Type
          29.       n = Name

          30. ~ Q8_U6w;SGT)`O'from' c = Exp

          31. yHm3l#Ex/W'when' t = Exp
          32.       b = Block
          33.       o = ('' Block | { JAVA中文站社区门户\3o1\&xWiR B
            Block; })
          34.       { JAVA中文站社区门户V `%R,t }-]^
            Select(T,n,c,t,b,o); }.  }

          35. 1fUQqxB7Z// Desugar to produce an abstract syntax tree

          36. 6~^cJ0{ k7Q9M't2] C Mpublic AST desugar(Context context) {
          37.      Class<T> cType = context.getType(collection);

          38. L(L$[x$\F1^2U(isVector(cType))
          39. JAVA中文站社区门户Ru5Lo3Y6x/A$_
            desugarVector(cType,contect);
          40. JAVA中文站社区门户?+~0Kh;^:L

            a;B4oF(F9D X!f// More s...
          41.    }
          42. JAVA中文站社区门户6DW:_@"W!K
            public AST desugarVector(Class<T> cType,Context context) {
          43.      Var done = context.Var;
          44.      Var coll = context.Var;

          45. "jvqYEh:J6y
          46.          [| boolean <done> = false;
          47.          <cType> coll = <collection>;

          48. ,k'v"RTe`:j,{pfor( i = 0; i < <coll>.size; i) {
          49.             <underlyingType(cType)> <var> = <coll>.elementAt(i);
          50. JAVA中文站社区门户9C1BPB6l1N$x4p
            (<test>) {
          51.              <done> = true;
          52.              <body>;
          53.            }
          54.          }
          55. JAVA中文站社区门户A3zv ^ J-}4g q"f
            (!<done>)
          56.              <otherwise>;
          57.          |];
          58.     }
          59. }
            JAVA中文站社区门户Z'\%Z,ir0?J7{A"\s+f
            JAVA中文站社区门户m sjj F @7LU

            Yu?a_-~3LQ
            1. package mylang;
            2. JAVA中文站社区门户BCqBt%S:i-o
              import language java.syntax.Grammar;

            3. 2Yl\eV2E7oimport java.syntax.AST;

            4. 8a8e c6Y:[~timport java.syntax.Block;

            5. s:bL,XqNimport java.syntax.Context;

            6. L/Oe%RKQ+O&P[4Uimport java.syntax.Statement;

            7. {!~Hqm:a5q-x}Yimport java.syntax.Sugar;

            8. %j Ec,g!z"I5M~;Zimport java.syntax.Type;

            9. K)z6l$d)iY)iimport java.syntax.Var;
            10. JAVA中文站社区门户5kB M3c3qhi-h m
              public
              !@| A8zxe~$ji Select extends Sugar {

            11. Z BFV:v2m yprivate Type type;
            12. JAVA中文站社区门户EOnE"_
              private Var var;

            13. 1u&M;| @!C%B jprivate AST collection;
            14. JAVA中文站社区门户A.e)Sv0C
              private AST test;
            15. JAVA中文站社区门户 L5N(g6` R-|]9Ui V
              private Block body;

            16. :lNp'X YH@private Block otherwise;
            17. JAVA中文站社区门户6[Hc'X:i:Y
              public Select(Type T,String n,AST c,AST t,Block b,Block o){
            18.     type = T;
            19.     var = Var(n);
            20.     collection = c;
            21.     test = t;
            22.     body = b;
            23.     otherwise = o;
            24.   }

            25. C R(K'l%@&c5z!Y// Select Grammar definition

            26. f&Up;F2vI@Grammar
              lY B pdAextends Statement {
            27.     Select ::=
            28.       T = Type
            29.       n = Name
            30. JAVA中文站社区门户0B#~CQ"D
              'from' c = Exp
            31. JAVA中文站社区门户X @tD9K%yv
              'when' t = Exp
            32.       b = Block
            33.       o = ('' Block | {
              E5a/r1Y7dvL4qy Block; })
            34.       {
              W+@SHb/?8n Select(T,n,c,t,b,o); }.  }
            35. JAVA中文站社区门户 r*Ygg6K9w9J
              // Desugar to produce an abstract syntax tree
            36. JAVA中文站社区门户H_ W0wEGk m.X
              public AST desugar(Context context) {
            37.      Class<T> cType = context.getType(collection);

            38. o/Ne0iNT1u/|(isVector(cType))

            39. i[b`9IIQ r desugarVector(cType,contect);

            40. %tP5A o#P2JR0k
              !l9DZnt V,er// More s...
            41.    }

            42. sa jY$W7Gpublic AST desugarVector(Class<T> cType,Context context) {
            43.      Var done = context.Var;
            44.      Var coll = context.Var;

            45. &f5Qm:Me!r0['q
            46.          [| boolean <done> = false;
            47.          <cType> coll = <collection>;
            48. JAVA中文站社区门户La/M:l Nvj
              for( i = 0; i < <coll>.size; i) {
            49.             <underlyingType(cType)> <var> = <coll>.elementAt(i);
            50. JAVA中文站社区门户1B%J*X8s)`.l3{
              (<test>) {
            51.              <done> = true;
            52.              <body>;
            53.            }
            54.          }
            55. JAVA中文站社区门户W1}F+Qsq8Q%vvO
              (!<done>)
            56.              <otherwise>;
            57.          |];
            58.     }
            59. }

              &\,aq]2]-mpackage mylang;import language java.syntax.Grammar;import java.syntax.AST;import java.syntax.Block;import java.syntax.Context;import java.syntax.Statement;import java.syntax.Sugar;import java.syntax.Type;import java.syntax.Var;public Select extends Sugar {    private Type type;    private Var var;   private AST collection;    private AST test;    private Block body;    private Block otherwise;    public Select(Type T,String n,AST c,AST t,Block b,Block o){    type = T;        var = Var(n);        collection = c;        test = t;        body = b;        otherwise = o;    }    // Select Grammar definition    @Grammar extends Statement {        Select ::=            T = Type            n = Name            'from' c = Exp            'when' t = Exp            b = Block            o = ('' Block | { Block; })            { Select(T,n,c,t,b,o); }.  }     // Desugar to produce an abstract syntax tree     public AST desugar(Context context) {     Class<T> cType = context.getType(collection);         (isVector(cType))             desugarVector(cType,contect);          // More s...     }     public AST desugarVector(Class<T> cType,Context context) {     Var done = context.Var;         Var coll = context.Var;                   [| boolean <done> = false;                       <cType> coll = <collection>;                       for( i = 0; i < <coll>.size; i) {                            <underlyingType(cType)> <var> = <coll>.elementAt(i);                           (<test>) {                               <done> = true;              <body>;                         }         }                       (!<done>)               <otherwise>;                   |];      }}
              Jz`^zM H3~ ~
              0J(K(te5R$Re,Q.O从Select语法规则定义可以看到个良好格式语句是通过个名称,关键字"from"及其表达式,关键字"when"及其表达式以及定义select块正文在正文后,还可以定义-的类可选关键字在select规则中每个解析元素产生个可以和名称可选关联例如和名称为"T"相关联类型另外解析规则也包含返回值Java语句这些包含在{and}中,而且可以引用任何在后面定义名称由Select rule返回最终结果是Select类个例子
              c5@W4O[lJAVA中文站社区门户pYb,O)z+S ` c
              由语法所决定返回值必须是java.syntax.AST类个例子如果返回值是标准Java AST类例子那在语法类中不需要做特殊处理如果返回值是自定义语法类例子那么这个类必须实现AST接口来由编译器翻译成Java VM识别代码更简单易行办法是用户自定义语义类从java.syntax.Sugar继承而java.syntax.Sugar通过desugar思路方法实现了AST接口desugar思路方法负责把输入信息解释为接口中已经定义AST(抽象语法树) JAVA中文站社区门户 Ibm;DwA#g r
              JAVA中文站社区门户*I&^M e`B0p
              在这篇短文中我们介绍了Java扩展(XJ)主要是通过定义新Java语法来对Java语言本身进行扩展虽然XJ还没有在Java中实现但是它是XMF语言主要特征XMF语言已经在商业工具(XMF-Mosaic)中被使用并在2008年开源有关本文更多细节和例子可以参照这篇文章:

              TAG: Java JAVA java 方案 语言
              0

              相关文章

              读者评论

              发表评论

              • 昵称:
              • 内容: