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

编译器/解释器

开发平台:

Others

  1. header {
  2. package antlr.preprocessor;
  3. }
  4. /* ANTLR Translator Generator
  5.  * Project led by Terence Parr at http://www.jGuru.com
  6.  * Software rights: http://www.antlr.org/RIGHTS.html
  7.  *
  8.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/preprocessor/preproc.g#1 $
  9.  */
  10. {
  11. import antlr.collections.impl.IndexedVector;
  12. import java.util.Hashtable;
  13. import antlr.preprocessor.Grammar;
  14. }
  15. class Preprocessor extends Parser;
  16. options {
  17. k=1;
  18. interactive=true;
  19. }
  20. tokens {
  21. "tokens";
  22. }
  23. grammarFile[Hierarchy hier, String file]
  24. {
  25. Grammar gr;
  26. IndexedVector opt=null;
  27. }
  28. : ( hdr:HEADER_ACTION { hier.getFile(file).addHeaderAction(hdr.getText()); } )*
  29. ( opt=optionSpec[null] )?
  30. ( gr=class_def[hier]
  31. {
  32. if ( opt!=null ) {
  33. hier.getFile(file).setOptions(opt);
  34. }
  35. if ( gr!=null ) {
  36. gr.setFileName(file);
  37. hier.addGrammar(gr);
  38. }
  39. }
  40. )*
  41. EOF
  42. ;
  43. class_def[Hierarchy hier] returns [Grammar gr]
  44. {
  45. gr=null;
  46. IndexedVector rules = new IndexedVector(100);
  47. IndexedVector classOptions = null;
  48. }
  49. : ( preamble:ACTION )?
  50. "class" sub:ID "extends" sup:ID SEMI
  51. {
  52. gr = (Grammar)hier.getGrammar(sub.getText());
  53. if ( gr!=null ) {
  54. antlr.Tool.toolError("redefinition of grammar "+gr.getName()+" ignored");
  55. gr=null;
  56. }
  57. else {
  58. gr = new Grammar(sub.getText(), sup.getText(), rules);
  59. if ( preamble!=null ) {
  60. gr.setPreambleAction(preamble.getText());
  61. }
  62. }
  63. }
  64. ( classOptions = optionSpec[gr] )?
  65. {
  66. if ( gr!=null ) {
  67. gr.setOptions(classOptions);
  68. }
  69. }
  70. ( tk:TOKENS_SPEC {gr.setTokenSection(tk.getText());} )?
  71. ( memberA:ACTION {gr.setMemberAction(memberA.getText());} )?
  72. ( rule[gr] )+
  73. ;
  74. optionSpec[Grammar gr] returns [IndexedVector options]
  75. {
  76. options = new IndexedVector();
  77. }
  78. : OPTIONS_START
  79. ( op:ID rhs:ASSIGN_RHS
  80. {
  81. Option newOp = new Option(op.getText(),rhs.getText(),gr);
  82. options.appendElement(newOp.getName(),newOp);
  83. if ( gr!=null && op.getText().equals("importVocab") ) {
  84. gr.specifiedVocabulary = true;
  85. gr.importVocab = rhs.getText();
  86. }
  87. else if ( gr!=null && op.getText().equals("exportVocab") ) {
  88. // don't want ';' included in outputVocab.
  89. // This is heinously inconsistent!  Ugh.
  90. gr.exportVocab = rhs.getText().substring(0,rhs.getText().length()-1);
  91. }
  92. }
  93. )*
  94. // {gr.fixupVocabOptionsForInheritance();}
  95. RCURLY
  96. ;
  97. rule[Grammar gr]
  98. {
  99. IndexedVector o = null; // options for rule
  100. String vis = null;
  101. boolean bang=false;
  102. String eg=null;
  103. }
  104. : ( "protected" {vis="protected";}
  105. | "private" {vis="private";}
  106. | "public" {vis="public";}
  107. )?
  108. r:ID
  109. ( BANG {bang=true;} )?
  110. ( arg:ARG_ACTION )?
  111. ( "returns" ret:ARG_ACTION )?
  112. ( o = optionSpec[null] )?
  113. ( init:ACTION )?
  114. blk:RULE_BLOCK
  115. eg=exceptionGroup
  116. {
  117. String rtext = blk.getText()+eg;
  118. Rule ppr = new Rule(r.getText(),rtext,o,gr);
  119. if ( arg!=null ) {
  120. ppr.setArgs(arg.getText());
  121. }
  122. if ( ret!=null ) {
  123. ppr.setReturnValue(ret.getText());
  124. }
  125. if ( init!=null ) {
  126. ppr.setInitAction(init.getText());
  127. }
  128. if ( bang ) {
  129. ppr.setBang();
  130. }
  131. ppr.setVisibility(vis);
  132. if ( gr!=null ) {
  133. gr.addRule(ppr);
  134. }
  135. }
  136. ;
  137. exceptionGroup returns [String g]
  138. {String e=null; g="";}
  139. : ( e=exceptionSpec {g += e;} )*
  140. ;
  141. exceptionSpec returns [String es]
  142. { String h=null;
  143.   es = System.getProperty("line.separator")+"exception ";
  144. }
  145. : "exception"
  146. ( aa:ARG_ACTION {es += aa.getText();} )?
  147. ( h=exceptionHandler {es += h;} )*
  148. ;
  149. exceptionHandler returns [String h]
  150. {h=null;}
  151. : "catch" a1:ARG_ACTION a2:ACTION
  152. {h = System.getProperty("line.separator")+
  153.  "catch "+a1.getText()+" "+a2.getText();}
  154. ;
  155. class PreprocessorLexer extends Lexer;
  156. options {
  157. k=2;
  158. charVocabulary = '3'..'176'; // common ASCII
  159. interactive=true;
  160. }
  161. RULE_BLOCK
  162.     :   ':' (options {greedy=true;}:WS!)?
  163. ALT (options {greedy=true;}:WS!)?
  164. ( '|' (options {greedy=true;}:WS!)? ALT (options {greedy=true;}:WS!)? )* ';'
  165.     ;
  166. SUBRULE_BLOCK
  167. : '(' (options {greedy=true;}:WS)? ALT
  168. ( options {greedy=true;}
  169. : (WS)? '|' (options {greedy=true;}:WS)? ALT
  170. )*
  171. (WS)?
  172. ')'
  173. ( options {greedy=true;}
  174. : '*'
  175. | '+'
  176. | '?'
  177. | "=>"
  178. )?
  179. ;
  180. protected
  181. ALT : (options {greedy=true;} : ELEMENT)*
  182. ;
  183. protected
  184. ELEMENT
  185. : COMMENT
  186. | ACTION
  187. | STRING_LITERAL
  188. | CHAR_LITERAL
  189. | SUBRULE_BLOCK
  190. | NEWLINE
  191. | ~('n' | 'r' | '(' | ')' | '/' | '{' | '"' | ''' | ';')
  192. ;
  193. BANG: '!'
  194. ;
  195. SEMI: ';'
  196. ;
  197. RCURLY
  198. : '}'
  199. ;
  200. /** This rule picks off keywords in the lexer that need to be
  201.  *  handled specially.  For example, "header" is the start
  202.  *  of the header action (used to distinguish between options
  203.  *  block and an action).  We do not want "header" to go back
  204.  *  to the parser as a simple keyword...it must pick off
  205.  *  the action afterwards.
  206.  */
  207. ID_OR_KEYWORD
  208. : id:ID {$setType(id.getType());}
  209. ( {id.getText().equals("header")}? (options {greedy=true;}:WS)?
  210. (STRING_LITERAL)? (WS)? ACTION
  211. {$setType(HEADER_ACTION);}
  212. | {id.getText().equals("tokens")}? (WS)? CURLY_BLOCK_SCARF
  213. {$setType(TOKENS_SPEC);}
  214. | {id.getText().equals("options")}? (WS)? '{'
  215. {$setType(OPTIONS_START);}
  216. )?
  217. ;
  218. protected
  219. CURLY_BLOCK_SCARF
  220. : '{'
  221. ( options {greedy=false;}
  222. : NEWLINE
  223. | .
  224. )*
  225. '}'
  226. ;
  227. protected
  228. ID
  229. options {
  230. testLiterals=true;
  231. }
  232. : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  233. ;
  234. ASSIGN_RHS
  235. : '='!
  236. ( options {greedy=false;}
  237. : STRING_LITERAL 
  238. | CHAR_LITERAL 
  239. | NEWLINE
  240. | .
  241. )*
  242. ';'
  243. ;
  244. WS : ( options {greedy=true;}
  245. :  ' '
  246. | 't'
  247. | NEWLINE
  248. )+
  249. {$setType(Token.SKIP);}
  250. ;
  251. protected
  252. NEWLINE
  253. : ( options {
  254. generateAmbigWarnings=false;
  255. }
  256. : 'r' 'n' {newline();}
  257. | 'r' {newline();}
  258. | 'n' {newline();}
  259. )
  260. ;
  261. COMMENT
  262. : ( SL_COMMENT | ML_COMMENT )
  263. {$setType(Token.SKIP);}
  264. ;
  265. protected
  266. SL_COMMENT
  267. : "//" (options {greedy=false;}:.)* NEWLINE
  268. ;
  269. protected
  270. ML_COMMENT :
  271. "/*"
  272. ( options {greedy=false;}
  273. : NEWLINE
  274. | .
  275. )*
  276. "*/"
  277. ;
  278. CHAR_LITERAL
  279. : ''' (ESC|~''') '''
  280. ;
  281. STRING_LITERAL
  282. : '"' (ESC|~'"')* '"'
  283. ;
  284. protected
  285. ESC : '\'
  286. ( 'n'
  287. | 'r'
  288. | 't'
  289. | 'b'
  290. | 'f'
  291. | 'w'
  292. | 'a'
  293. | '"'
  294. | '''
  295. | '\'
  296. | ('0'..'3')
  297. ( options {greedy=true;}
  298. : DIGIT
  299. ( options {greedy=true;}
  300. : DIGIT
  301. )?
  302. )?
  303. | ('4'..'7') (options {greedy=true;}:DIGIT)?
  304. | 'u' XDIGIT XDIGIT XDIGIT XDIGIT
  305. )
  306. ;
  307. protected
  308. DIGIT
  309. : '0'..'9'
  310. ;
  311. protected
  312. XDIGIT
  313. : '0' .. '9'
  314. | 'a' .. 'f'
  315. | 'A' .. 'F'
  316. ;
  317. ARG_ACTION
  318. : '['
  319. (
  320. options {
  321. greedy=false;
  322. }
  323. : ARG_ACTION
  324. | NEWLINE
  325. | CHAR_LITERAL 
  326. | STRING_LITERAL 
  327. | .
  328. )* 
  329. ']'
  330. ;
  331. ACTION
  332. : '{'
  333. (
  334. options {
  335. greedy=false;
  336. }
  337. : NEWLINE
  338. | ACTION
  339. | CHAR_LITERAL
  340. | COMMENT
  341. | STRING_LITERAL
  342. | .
  343. )*
  344. '}'
  345.    ;