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

编译器/解释器

开发平台:

Others

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