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

编译器/解释器

开发平台:

Others

  1. header {
  2. package antlr.actions.java;
  3. }
  4. {
  5. import java.io.StringReader;
  6. import antlr.collections.impl.Vector;
  7. import antlr.*;
  8. }
  9. /* ANTLR Translator Generator
  10.  * Project led by Terence Parr at http://www.jGuru.com
  11.  * Software rights: http://www.antlr.org/RIGHTS.html
  12.  *
  13.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/actions/java/action.g#1 $
  14.  */
  15. /** Perform the following translations:
  16.     AST related translations
  17. ## -> currentRule_AST
  18. #(x,y,z) -> codeGenerator.getASTCreateString(vector-of(x,y,z))
  19. #[x] -> codeGenerator.getASTCreateString(x)
  20. #x -> codeGenerator.mapTreeId(x)
  21. Inside context of #(...), you can ref (x,y,z), [x], and x as shortcuts.
  22.     Text related translations
  23. $append(x) -> text.append(x)
  24. $setText(x) -> text.setLength(_begin); text.append(x)
  25. $getText -> new String(text.getBuffer(),_begin,text.length()-_begin)
  26. $setToken(x) -> _token = x
  27. $setType(x) -> _ttype = x
  28.  */
  29. class ActionLexer extends Lexer;
  30. options {
  31. k=2;
  32. charVocabulary='3'..'176';
  33. testLiterals=false;
  34. interactive=true;
  35. }
  36. {
  37. protected RuleBlock currentRule;
  38. protected CodeGenerator generator;
  39. protected int lineOffset = 0;
  40. private Tool tool; // The ANTLR tool
  41. ActionTransInfo transInfo;
  42.   public ActionLexer( String s,
  43. RuleBlock currentRule,
  44. CodeGenerator generator,
  45. ActionTransInfo transInfo) {
  46. this(new StringReader(s));
  47. this.currentRule = currentRule;
  48. this.generator = generator;
  49. this.transInfo = transInfo;
  50. }
  51. public void setLineOffset(int lineOffset) {
  52. // this.lineOffset = lineOffset;
  53. setLine(lineOffset);
  54. }
  55. public void setTool(Tool tool) {
  56. this.tool = tool;
  57. }
  58. // Override of error-reporting for syntax
  59. public void reportError(RecognitionException e) {
  60. System.err.print("Syntax error in action: ");
  61. super.reportError(e);
  62. }
  63. }
  64. // rules are protected because we don't care about nextToken().
  65. public
  66. ACTION
  67. : ( STUFF
  68. | AST_ITEM
  69. | TEXT_ITEM
  70. )+
  71. ;
  72. // stuff in between #(...) and #id items
  73. protected
  74. STUFF
  75. : COMMENT
  76. | STRING
  77. | CHAR
  78. | "rn"  {newline();}
  79. | 'r'  {newline();}
  80. | 'n' {newline();}
  81. | '/' ~('/'|'*') // non-comment start '/'
  82. // | ( ~('/'|'n'|'r'|'$'|'#'|'"'|''') )+
  83. | ~('/'|'n'|'r'|'$'|'#'|'"'|''')
  84. ;
  85. protected
  86. AST_ITEM
  87. : '#'! t:TREE
  88. | '#'! id:ID
  89. {
  90. String idt = id.getText();
  91. $setText(generator.mapTreeId(idt,transInfo));
  92. }
  93. (WS)?
  94. ( options {greedy=true;} : VAR_ASSIGN )?
  95. | '#'! ctor:AST_CONSTRUCTOR
  96. | "##"
  97. {
  98. String r=currentRule.getRuleName()+"_AST"; $setText(r);
  99. if ( transInfo!=null ) {
  100. transInfo.refRuleRoot=r; // we ref root of tree
  101. }
  102. }
  103. (WS)? 
  104. ( options {greedy=true;} : VAR_ASSIGN )?
  105. ;
  106. protected
  107. TEXT_ITEM
  108. : "$append(" a1:TEXT_ARG ')'
  109. {String t = "text.append("+a1.getText()+")"; $setText(t);}
  110. | "$set"
  111. ( "Text(" a2:TEXT_ARG ')'
  112. {
  113. String t;
  114. if (generator instanceof CppCodeGenerator) {
  115. t="text.erase(_begin); text.append("+a2.getText()+")";
  116. } else {
  117. t="text.setLength(_begin); text.append("+a2.getText()+")";
  118. }
  119. $setText(t);
  120. }
  121. | "Token(" a3:TEXT_ARG ')'
  122. {
  123. String t="_token = "+a3.getText();
  124. $setText(t);
  125. }
  126. | "Type(" a4:TEXT_ARG ')'
  127. {
  128. String t="_ttype = "+a4.getText();
  129. $setText(t);
  130. }
  131. )
  132. | "$getText"
  133. {
  134. if (generator instanceof CppCodeGenerator) {
  135. $setText("text.substr(_begin,text.length()-_begin)");
  136. } else {
  137. $setText("new String(text.getBuffer(),_begin,text.length()-_begin)");
  138. }
  139. }
  140. ;
  141. protected
  142. TREE!
  143. {
  144. StringBuffer buf = new StringBuffer();
  145. int n=0;
  146. Vector terms = new Vector(10);
  147. }
  148. : '('
  149. (WS)?
  150. t:TREE_ELEMENT {terms.appendElement(t.getText());}
  151. (WS)?
  152. ( ',' (WS)?
  153. t2:TREE_ELEMENT {terms.appendElement(t2.getText());}
  154. (WS)?
  155. )*
  156. {$setText(generator.getASTCreateString(terms));}
  157. ')'
  158. ;
  159. protected
  160. TREE_ELEMENT
  161. : '#'! TREE
  162. | '#'! AST_CONSTRUCTOR
  163. | '#'! id:ID_ELEMENT
  164. {String t=generator.mapTreeId(id.getText(), null); $setText(t);}
  165. | "##"
  166. {String t = currentRule.getRuleName()+"_AST"; $setText(t);}
  167. | TREE
  168. | AST_CONSTRUCTOR
  169. | ID_ELEMENT
  170. | STRING
  171. ;
  172. protected
  173. AST_CONSTRUCTOR!
  174. : '[' (WS)? x:AST_CTOR_ELEMENT (WS)?
  175. (',' (WS)? y:AST_CTOR_ELEMENT (WS)? )? ']'
  176. {
  177. String ys = "";
  178. if ( y!=null ) {
  179. ys = ","+y.getText();
  180. }
  181. $setText(generator.getASTCreateString(null,x.getText()+ys));
  182. }
  183. ;
  184. /** The arguments of a #[...] constructor are text, token type,
  185.  *  or a tree.
  186.  */
  187. protected
  188. AST_CTOR_ELEMENT
  189. : STRING
  190. | INT
  191. | TREE_ELEMENT
  192. ;
  193. /** An ID_ELEMENT can be a func call, array ref, simple var,
  194.  *  or AST label ref.
  195.  */
  196. protected
  197. ID_ELEMENT
  198. : id:ID (options {greedy=true;}:WS!)?
  199. ( '(' (options {greedy=true;}:WS!)? ( ARG (',' (WS!)? ARG)* )? (WS!)? ')' // method call
  200. | ( '[' (WS!)? ARG (WS!)? ']' )+ // array reference
  201. | '.' ID_ELEMENT
  202. | /* could be a token reference or just a user var */
  203. {
  204. String t=generator.mapTreeId(id.getText(), transInfo);
  205. $setText(t);
  206. }
  207. // if #rule referenced, check for assignment
  208. ( options {greedy=true;}
  209. : {transInfo!=null && transInfo.refRuleRoot!=null}?
  210. (WS)? VAR_ASSIGN
  211. )?
  212. )
  213. ;
  214. protected
  215. TEXT_ARG
  216. : ( TEXT_ARG_ELEMENT (options {greedy=true;}:WS)? )+
  217. ;
  218. protected
  219. TEXT_ARG_ELEMENT
  220. : TEXT_ARG_ID_ELEMENT
  221. | STRING
  222. | CHAR
  223. | INT_OR_FLOAT
  224. | TEXT_ITEM
  225. | '+'
  226. ;
  227. protected
  228. TEXT_ARG_ID_ELEMENT
  229. : id:ID (options {greedy=true;}:WS!)?
  230. ( '(' (options {greedy=true;}:WS!)? ( TEXT_ARG (',' TEXT_ARG)* )* (WS!)? ')' // method call
  231. | ( '[' (WS!)? TEXT_ARG (WS!)? ']' )+ // array reference
  232. | '.' TEXT_ARG_ID_ELEMENT
  233. | "->" TEXT_ARG_ID_ELEMENT
  234. | "::" TEXT_ARG_ID_ELEMENT
  235. |
  236. )
  237. ;
  238. protected
  239. ARG : ( TREE_ELEMENT
  240. | STRING
  241. | CHAR
  242. | INT_OR_FLOAT
  243. )
  244. (options {greedy=true;} : (WS)? ( '+'| '-' | '*' | '/' ) (WS)? ARG )*
  245. ;
  246. protected
  247. ID : ('a'..'z'|'A'..'Z'|'_')
  248. (options {greedy=true;} : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'))*
  249. ;
  250. protected
  251. VAR_ASSIGN
  252. : '='
  253. {
  254. // inform the code generator that an assignment was done to
  255. // AST root for the rule if invoker set refRuleRoot.
  256. if ( LA(1)!='=' && transInfo!=null && transInfo.refRuleRoot!=null ) {
  257. transInfo.assignToRoot=true;
  258. }
  259. }
  260. ;
  261. protected
  262. COMMENT
  263. : SL_COMMENT
  264. | ML_COMMENT
  265. ;
  266. protected
  267. SL_COMMENT
  268. : "//" (options {greedy=false;}:.)* ('n'|"rn"|'r')
  269. {newline();}
  270. ;
  271. protected
  272. ML_COMMENT :
  273. "/*"
  274. ( options {greedy=false;}
  275. : 'r' 'n' {newline();}
  276. | 'r'  {newline();}
  277. | 'n' {newline();}
  278. | .
  279. )*
  280. "*/"
  281. ;
  282. protected
  283. CHAR :
  284. ''' 
  285. ( ESC | ~''' ) 
  286. '''
  287. ;
  288. protected
  289. STRING :
  290. '"' 
  291. (ESC|~'"')* 
  292. '"'
  293. ;
  294. protected
  295. ESC : '\'
  296. ( 'n'
  297. | 'r'
  298. | 't'
  299. | 'b'
  300. | 'f'
  301. | '"'
  302. | '''
  303. | '\'
  304. | ('0'..'3')
  305. ( options {greedy=true;}
  306. : DIGIT
  307. ( options {greedy=true;}
  308. : DIGIT
  309. )?
  310. )?
  311. | ('4'..'7') (options {greedy=true;}:DIGIT)?
  312. )
  313. ;
  314. protected
  315. DIGIT
  316. : '0'..'9'
  317. ;
  318. protected
  319. INT : (DIGIT)+
  320. ;
  321. protected
  322. INT_OR_FLOAT
  323. : (options {greedy=true;}:DIGIT)+
  324. ( options {greedy=true;}
  325. : '.' (options {greedy=true;}:DIGIT)*
  326. | 'L'
  327. | 'l'
  328. )?
  329. ;
  330. protected
  331. WS : ( options {greedy=true;}
  332. :  ' '
  333. | 't'
  334. | 'r' 'n' {newline();}
  335. | 'r' {newline();}
  336. | 'n' {newline();}
  337. )+
  338. ;