test.g
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:7k
源码类别:

编译器/解释器

开发平台:

Others

  1. header {
  2. #include "SupportTestTokenTypes.hpp"
  3. #include <iostream>
  4. }
  5. options {
  6. language=Cpp;
  7. }
  8. class SupportTest extends Parser;
  9. options {
  10. buildAST = true;
  11. }
  12. {
  13. /** Test the equals, equalsSubtree, and findAll methods plus AST enumeration.
  14.  *  The output should be: 
  15. t is  ( = a 1 )
  16. u is  ( = b )
  17. v is  ( = 4 )
  18. w is  =
  19. t.equalsTree(t) is true
  20. t.equalsTree(u) is false
  21. t.equalsTree(v) is false
  22. t.equalsTree(w) is false
  23. t.equalsTree(null) is false
  24. t.equalsTreePartial(t) is true
  25. t.equalsTreePartial(u) is false
  26. t.equalsTreePartial(v) is false
  27. t.equalsTreePartial(w) is true
  28. t.equalsTreePartial(null) is true
  29. a is  ( A ( B C ( A B ) ) ( A B ) ( F ( A B ) ) ( A ( A B ) ) ) J
  30.               A---------------------J
  31.               |
  32.               B-----A-----F----A
  33.               |     |     |    |
  34.               C--A  B     A    A
  35.                  |        |    |
  36.                  B        B    B
  37. x is second sibling of upperleftmost A:  ( A B ) ( F ( A B ) ) ( A ( A B ) )
  38. y is child B of x:  B
  39. x.equalsTree(#(A B)) is true
  40. x.equalsList(#(A B)) is false
  41. x.equalsListPartial(#(A B)) is true
  42. a.equalsTree(#(A B)) is false
  43. a.equalsTreePartial(#(A B)) is true
  44. y.equalsList(#[B]) is true
  45. y.equalsListPartial(#[B]) is true
  46. a.findAllPartial(#(A B)):
  47.  ( A ( B C ( A B ) ) ( A B ) ( F ( A B ) ) ( A ( A B ) ) ) J
  48.  ( A B )
  49.  ( A B ) ( F ( A B ) ) ( A ( A B ) )
  50.  ( A B )
  51.  ( A B )
  52. a.findAllPartial(#[A])):
  53.  ( A ( B C ( A B ) ) ( A B ) ( F ( A B ) ) ( A ( A B ) ) ) J
  54.  ( A B )
  55.  ( A B ) ( F ( A B ) ) ( A ( A B ) )
  56.  ( A B )
  57.  ( A ( A B ) )
  58.  ( A B )
  59. a.findAll(#(A B)):
  60.  ( A B )
  61.  ( A B ) ( F ( A B ) ) ( A ( A B ) )
  62.  ( A B )
  63.  ( A B )
  64. Test results:
  65. equalsTree is ok
  66. equalsTreePartial is ok
  67. equalsList is ok
  68. equalsListPartial is ok
  69.  */
  70. public:
  71. static void main()
  72. {
  73. ANTLR_USING_NAMESPACE(std)
  74. ANTLR_USING_NAMESPACE(antlr)
  75. bool r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17;
  76. // define "astFactory" so translation of #(...) works
  77. ASTFactory astFactory;
  78. RefAST t = #([ASSIGN,"="], [ID,"a"], [INT,"1"]); // build "a=1" tree
  79. cout << "t is " << t->toStringList() << endl;
  80. RefAST u = #([ASSIGN,"="], [ID,"b"]); // build "b=?" tree
  81. cout << "u is " << u->toStringList() << endl;
  82. RefAST v = #([ASSIGN,"="], [INT,"4"]); // build "4=?" tree
  83. cout << "v is " << v->toStringList() << endl;
  84. RefAST w = #[ASSIGN,"="]; // build "=" tree
  85. cout << "w is " << w->toStringList() << endl;
  86. cout << endl;
  87. cout << "t.equalsTree(t) is " << (r1=t->equalsTree(t)) << endl;
  88. cout << "t.equalsTree(u) is " << (r2=t->equalsTree(u)) << endl;
  89. cout << "t.equalsTree(v) is " << (r3=t->equalsTree(v)) << endl;
  90. cout << "t.equalsTree(w) is " << (r4=t->equalsTree(w)) << endl;
  91. cout << "t.equalsTree(null) is " << (r5=t->equalsTree(nullAST)) << endl;
  92. cout << endl;
  93. cout << "t.equalsTreePartial(t) is " << (r6=t->equalsTreePartial(t)) << endl;
  94. cout << "t.equalsTreePartial(u) is " << (r7=t->equalsTreePartial(u)) << endl;
  95. cout << "t.equalsTreePartial(v) is " << (r8=t->equalsTreePartial(v)) << endl;
  96. cout << "t.equalsTreePartial(w) is " << (r9=t->equalsTreePartial(w)) << endl;
  97. cout << "t.equalsTreePartial(null) is " << (r10=t->equalsTreePartial(nullAST)) << endl;
  98. cout << endl;
  99. /* (A (B C (A B)) (A B) (F (A B)) (A (A B)) ) J
  100.    Visually:
  101.               A---------------------J
  102.               |
  103.               B-----A-----F----A
  104.               |     |     |    |
  105.               C--A  B     A    A
  106.                  |        |    |
  107.                  B        B    B
  108. */
  109. RefAST a = #(nullAST,
  110. ([A,"A"],
  111. ([B,"B"], [C,"C"], ([A,"A"],[B,"B"])),
  112. ([A,"A"],[B,"B"]),
  113. ([F,"F"], #([A,"A"], [B,"B"])),
  114. ([A,"A"], #([A,"A"], [B,"B"]))),
  115. [J,"J"]); 
  116. cout << "a is "<<a->toStringList()<<"n" << endl;
  117. cout << "              A---------------------J" << endl;
  118. cout << "              |" << endl;
  119. cout << "              B-----A-----F----A" << endl;
  120. cout << "              |     |     |    |" << endl;
  121. cout << "              C--A  B     A    A" << endl;
  122. cout << "                 |        |    |" << endl;
  123. cout << "                 B        B    Bn" << endl;
  124. RefAST x = a->getFirstChild()->getNextSibling();
  125. cout << "x is second sibling of upperleftmost A: "<<x->toStringList() << endl;
  126. RefAST y = a->getFirstChild()->getNextSibling()->getFirstChild();
  127. cout << "y is child B of x: "<<y->toStringList() << endl;
  128. cout << "x.equalsTree(#(A B)) is "<<(r11=x->equalsTree(#([A,"A"],[B,"B"]))) << endl;
  129. cout << "x.equalsList(#(A B)) is "<<(r12=x->equalsList(#([A,"A"],[B,"B"]))) << endl;
  130. cout << "x.equalsListPartial(#(A B)) is "<<(r13=x->equalsListPartial(#([A,"A"],[B,"B"]))) << endl;
  131. cout << "a.equalsTree(#(A B)) is "<<(r14=a->equalsTree(#([A,"A"],[B,"B"]))) << endl;
  132. cout << "a.equalsTreePartial(#(A B)) is "<<(r15=a->equalsTreePartial(#([A,"A"],[B,"B"]))) << endl;
  133. cout << "y.equalsList(#[B]) is "<<(r16=y->equalsList(#[B,"B"])) << endl;
  134. cout << "y.equalsListPartial(#[B]) is "<<(r17=y->equalsList(#[B,"B"])) << endl;
  135. vector<RefAST> _enum;
  136. cout << "na.findAllPartial(#(A B)):" << endl;
  137. _enum = a->findAllPartial(#([A,"A"],[B,"B"]));
  138. {for (vector<RefAST>::const_iterator i=_enum.begin();i!=_enum.end();i++) {
  139. cout << (*i)->toStringList() << endl;
  140. }}
  141. cout << "na.findAllPartial(#[A])):" << endl;
  142. _enum = a->findAllPartial(#[A,"A"]);
  143. {for (vector<RefAST>::const_iterator i=_enum.begin();i!=_enum.end();i++) {
  144. cout << (*i)->toStringList() << endl;
  145. }}
  146. cout << "na.findAll(#(A B)):" << endl;
  147. _enum = a->findAll(#([A,"A"],[B,"B"]));
  148. {for (vector<RefAST>::const_iterator i=_enum.begin();i!=_enum.end();i++) {
  149. cout << (*i)->toStringList() << endl;
  150. }}
  151. // check results
  152. cout << "nTest results:" << endl;
  153. if ( r1==true && r2==false && r3==false && r4==false &&
  154.  r5==false && r11==true && r14==false) {
  155. cout << "equalsTree is ok" << endl;
  156. }
  157. else {
  158. cout << "equalsTree is bad" << endl;
  159. }
  160. if ( r6==true && r7==false && r8==false && r9==true && r10==true ) {
  161. cout << "equalsTreePartial is ok" << endl;
  162. }
  163. else {
  164. cout << "equalsTreePartial is bad" << endl;
  165. }
  166. if ( r12==false && r16==true ) {
  167. cout << "equalsList is ok" << endl;
  168. }
  169. else {
  170. cout << "equalslist is bad" << endl;
  171. }
  172. if ( r13==true && r17==true ) {
  173. cout << "equalsListPartial is ok" << endl;
  174. }
  175. else {
  176. cout << "equalslistPartial is bad" << endl;
  177. }
  178. }
  179. }
  180. defTokenTypes
  181. : ID INT ASSIGN PLUS A B C D E F G H I J K
  182. ;
  183. /*
  184. rule[AST t] : BLAH;
  185. another
  186. {
  187.  #another = on here. // should translate
  188. }
  189. : rule[#another=foo] rule[#another] A
  190. // should get errors on those rule refs
  191. ;
  192. */