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

编译器/解释器

开发平台:

Others

  1. /** Java 1.2 Recognizer
  2.  *
  3.  * Run 'java Main <directory full of java files>'
  4.  *
  5.  * Contributing authors:
  6.  * John Mitchell johnm@non.net
  7.  * Terence Parr parrt@magelang.com
  8.  * John Lilley jlilley@empathy.com
  9.  * Scott Stanchfield thetick@magelang.com
  10.  * Markus Mohnen       mohnen@informatik.rwth-aachen.de
  11.  * Peter Williams pwilliams@netdynamics.com
  12.  *
  13.  * Version 1.00 December 9, 1997 -- initial release
  14.  * Version 1.01 December 10, 1997
  15.  * fixed bug in octal def (0..7 not 0..8)
  16.  * Version 1.10 August 1998 (parrt)
  17.  * added tree construction
  18.  * fixed definition of WS,comments for mac,pc,unix newlines
  19.  * added unary plus
  20.  * Version 1.11 (Nov 20, 1998)
  21.  * Added "shutup" option to turn off last ambig warning.
  22.  * Fixed inner class def to allow named class defs as statements
  23.  * synchronized requires compound not simple statement
  24.  * add [] after builtInType DOT class in primaryExpression
  25.  * "const" is reserved but not valid..removed from modifiers
  26.  * Version 1.12 (Feb 2, 1999)
  27.  * Changed LITERAL_xxx to xxx in tree grammar.
  28.  * Updated java.g to use tokens {...} now for 2.6.0 (new feature).
  29.  *
  30.  * Version 1.13 (Apr 23, 1999)
  31.  * Didn't have (stat)? for else clause in tree parser.
  32.  * Didn't gen ASTs for interface extends.  Updated tree parser too.
  33.  * Updated to 2.6.0.
  34.  * Version 1.14 (Jun 20, 1999)
  35.  * Allowed final/abstract on local classes.
  36.  * Removed local interfaces from methods
  37.  * Put instanceof precedence where it belongs...in relationalExpr
  38.  * It also had expr not type as arg; fixed it.
  39.  * Missing ! on SEMI in classBlock
  40.  * fixed: (expr) + "string" was parsed incorrectly (+ as unary plus).
  41.  * fixed: didn't like Object[].class in parser or tree parser
  42.  * Version 1.15 (Jun 26, 1999)
  43.  * Screwed up rule with instanceof in it. :(  Fixed.
  44.  * Tree parser didn't like (expr).something; fixed.
  45.  * Allowed multiple inheritance in tree grammar. oops.
  46.  * Version 1.16 (August 22, 1999)
  47.  * Extending an interface built a wacky tree: had extra EXTENDS.
  48.  * Tree grammar didn't allow multiple superinterfaces.
  49.  * Tree grammar didn't allow empty var initializer: {}
  50.  * Version 1.17 (October 12, 1999)
  51.  * ESC lexer rule allowed 399 max not 377 max.
  52.  * java.tree.g didn't handle the expression of synchronized
  53.  * statements.
  54.  *
  55.  * Version tracking now done with following ID:
  56.  *
  57.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/examples/java/java/java.g#1 $
  58.  *
  59.  * BUG:
  60.  *  Doesn't like boolean.class!
  61.  *
  62.  * class Test {
  63.  *   public static void main( String args[] ) {
  64.  *     if (boolean.class.equals(boolean.class)) {
  65.  *       System.out.println("works");
  66.  *     }
  67.  *   }
  68.  * }
  69.  *
  70.  * This grammar is in the PUBLIC DOMAIN
  71.  */
  72. class JavaRecognizer extends Parser;
  73. options {
  74. k = 2;                           // two token lookahead
  75. exportVocab=Java;                // Call its vocabulary "Java"
  76. codeGenMakeSwitchThreshold = 2;  // Some optimizations
  77. codeGenBitsetTestThreshold = 3;
  78. defaultErrorHandler = false;     // Don't generate parser error handlers
  79. buildAST = true;
  80. }
  81. tokens {
  82. BLOCK; MODIFIERS; OBJBLOCK; SLIST; CTOR_DEF; METHOD_DEF; VARIABLE_DEF; 
  83. INSTANCE_INIT; STATIC_INIT; TYPE; CLASS_DEF; INTERFACE_DEF; 
  84. PACKAGE_DEF; ARRAY_DECLARATOR; EXTENDS_CLAUSE; IMPLEMENTS_CLAUSE;
  85. PARAMETERS; PARAMETER_DEF; LABELED_STAT; TYPECAST; INDEX_OP; 
  86. POST_INC; POST_DEC; METHOD_CALL; EXPR; ARRAY_INIT; 
  87. IMPORT; UNARY_MINUS; UNARY_PLUS; CASE_GROUP; ELIST; FOR_INIT; FOR_CONDITION; 
  88. FOR_ITERATOR; EMPTY_STAT; FINAL="final"; ABSTRACT="abstract";
  89. }
  90. // Compilation Unit: In Java, this is a single file.  This is the start
  91. //   rule for this parser
  92. compilationUnit
  93. : // A compilation unit starts with an optional package definition
  94. ( packageDefinition
  95. | /* nothing */
  96. )
  97. // Next we have a series of zero or more import statements
  98. ( importDefinition )*
  99. // Wrapping things up with any number of class or interface
  100. //    definitions
  101. ( typeDefinition )*
  102. EOF!
  103. ;
  104. // Package statement: "package" followed by an identifier.
  105. packageDefinition
  106. options {defaultErrorHandler = true;} // let ANTLR handle errors
  107. : p:"package"^ {#p.setType(PACKAGE_DEF);} identifier SEMI!
  108. ;
  109. // Import statement: import followed by a package or class name
  110. importDefinition
  111. options {defaultErrorHandler = true;}
  112. : i:"import"^ {#i.setType(IMPORT);} identifierStar SEMI!
  113. ;
  114. // A type definition in a file is either a class or interface definition.
  115. typeDefinition
  116. options {defaultErrorHandler = true;}
  117. : m:modifiers!
  118. ( classDefinition[#m]
  119. | interfaceDefinition[#m]
  120. )
  121. | SEMI!
  122. ;
  123. /** A declaration is the creation of a reference or primitive-type variable
  124.  *  Create a separate Type/Var tree for each var in the var list.
  125.  */
  126. declaration!
  127. : m:modifiers t:typeSpec[false] v:variableDefinitions[#m,#t]
  128. {#declaration = #v;}
  129. ;
  130. // A list of zero or more modifiers.  We could have used (modifier)* in
  131. //   place of a call to modifiers, but I thought it was a good idea to keep
  132. //   this rule separate so they can easily be collected in a Vector if
  133. //   someone so desires
  134. modifiers
  135. : ( modifier )*
  136. {#modifiers = #([MODIFIERS, "MODIFIERS"], #modifiers);}
  137. ;
  138. // A type specification is a type name with possible brackets afterwards
  139. //   (which would make it an array type).
  140. typeSpec[boolean addImagNode]
  141. : classTypeSpec[addImagNode]
  142. | builtInTypeSpec[addImagNode]
  143. ;
  144. // A class type specification is a class type with possible brackets afterwards
  145. //   (which would make it an array type).
  146. classTypeSpec[boolean addImagNode]
  147. : identifier (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)*
  148. {
  149. if ( addImagNode ) {
  150. #classTypeSpec = #(#[TYPE,"TYPE"], #classTypeSpec);
  151. }
  152. }
  153. ;
  154. // A builtin type specification is a builtin type with possible brackets
  155. // afterwards (which would make it an array type).
  156. builtInTypeSpec[boolean addImagNode]
  157. : builtInType (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)*
  158. {
  159. if ( addImagNode ) {
  160. #builtInTypeSpec = #(#[TYPE,"TYPE"], #builtInTypeSpec);
  161. }
  162. }
  163. ;
  164. // A type name. which is either a (possibly qualified) class name or
  165. //   a primitive (builtin) type
  166. type
  167. : identifier
  168. | builtInType
  169. ;
  170. // The primitive types.
  171. builtInType
  172. : "void"
  173. | "boolean"
  174. | "byte"
  175. | "char"
  176. | "short"
  177. | "int"
  178. | "float"
  179. | "long"
  180. | "double"
  181. ;
  182. // A (possibly-qualified) java identifier.  We start with the first IDENT
  183. //   and expand its name by adding dots and following IDENTS
  184. identifier
  185. : IDENT  ( DOT^ IDENT )*
  186. ;
  187. identifierStar
  188. : IDENT
  189. ( DOT^ IDENT )*
  190. ( DOT^ STAR  )?
  191. ;
  192. // modifiers for Java classes, interfaces, class/instance vars and methods
  193. modifier
  194. : "private"
  195. | "public"
  196. | "protected"
  197. | "static"
  198. | "transient"
  199. | "final"
  200. | "abstract"
  201. | "native"
  202. | "threadsafe"
  203. | "synchronized"
  204. // | "const" // reserved word; leave out
  205. | "volatile"
  206. ;
  207. // Definition of a Java class
  208. classDefinition![AST modifiers]
  209. : "class" IDENT
  210. // it _might_ have a superclass...
  211. sc:superClassClause
  212. // it might implement some interfaces...
  213. ic:implementsClause
  214. // now parse the body of the class
  215. cb:classBlock
  216. {#classDefinition = #(#[CLASS_DEF,"CLASS_DEF"],
  217.    modifiers,IDENT,sc,ic,cb);}
  218. ;
  219. superClassClause!
  220. : ( "extends" id:identifier )?
  221. {#superClassClause = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"],id);}
  222. ;
  223. // Definition of a Java Interface
  224. interfaceDefinition![AST modifiers]
  225. : "interface" IDENT
  226. // it might extend some other interfaces
  227. ie:interfaceExtends
  228. // now parse the body of the interface (looks like a class...)
  229. cb:classBlock
  230. {#interfaceDefinition = #(#[INTERFACE_DEF,"INTERFACE_DEF"],
  231. modifiers,IDENT,ie,cb);}
  232. ;
  233. // This is the body of a class.  You can have fields and extra semicolons,
  234. // That's about it (until you see what a field is...)
  235. classBlock
  236. : LCURLY!
  237. ( field | SEMI! )*
  238. RCURLY!
  239. {#classBlock = #([OBJBLOCK, "OBJBLOCK"], #classBlock);}
  240. ;
  241. // An interface can extend several other interfaces...
  242. interfaceExtends
  243. : (
  244. e:"extends"!
  245. identifier ( COMMA! identifier )*
  246. )?
  247. {#interfaceExtends = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"],
  248. #interfaceExtends);}
  249. ;
  250. // A class can implement several interfaces...
  251. implementsClause
  252. : (
  253. i:"implements"! identifier ( COMMA! identifier )*
  254. )?
  255. {#implementsClause = #(#[IMPLEMENTS_CLAUSE,"IMPLEMENTS_CLAUSE"],
  256.  #implementsClause);}
  257. ;
  258. // Now the various things that can be defined inside a class or interface...
  259. // Note that not all of these are really valid in an interface (constructors,
  260. //   for example), and if this grammar were used for a compiler there would
  261. //   need to be some semantic checks to make sure we're doing the right thing...
  262. field!
  263. : // method, constructor, or variable declaration
  264. mods:modifiers
  265. ( h:ctorHead s:compoundStatement // constructor
  266. {#field = #(#[CTOR_DEF,"CTOR_DEF"], mods, h, s);}
  267. | cd:classDefinition[#mods]       // inner class
  268. {#field = #cd;}
  269. | id:interfaceDefinition[#mods]   // inner interface
  270. {#field = #id;}
  271. | t:typeSpec[false]  // method or variable declaration(s)
  272. ( IDENT  // the name of the method
  273. // parse the formal parameter declarations.
  274. LPAREN! param:parameterDeclarationList RPAREN!
  275. rt:returnTypeBrackersOnEndOfMethodHead[#t]
  276. // get the list of exceptions that this method is declared to throw
  277. (tc:throwsClause)?
  278. ( s2:compoundStatement | SEMI )
  279. {#field = #(#[METHOD_DEF,"METHOD_DEF"],
  280.      mods,
  281.  #(#[TYPE,"TYPE"],rt),
  282.  IDENT,
  283.  param,
  284.  tc,
  285.  s2);}
  286. | v:variableDefinitions[#mods,#t] SEMI
  287. // {#field = #(#[VARIABLE_DEF,"VARIABLE_DEF"], v);}
  288. {#field = #v;}
  289. )
  290. )
  291.     // "static { ... }" class initializer
  292. | "static" s3:compoundStatement
  293. {#field = #(#[STATIC_INIT,"STATIC_INIT"], s3);}
  294.     // "{ ... }" instance initializer
  295. | s4:compoundStatement
  296. {#field = #(#[INSTANCE_INIT,"INSTANCE_INIT"], s4);}
  297. ;
  298. variableDefinitions[AST mods, AST t]
  299. : variableDeclarator[getASTFactory().dupTree(mods),
  300.    getASTFactory().dupTree(t)]
  301. ( COMMA!
  302. variableDeclarator[getASTFactory().dupTree(mods),
  303.    getASTFactory().dupTree(t)]
  304. )*
  305. ;
  306. /** Declaration of a variable.  This can be a class/instance variable,
  307.  *   or a local variable in a method
  308.  * It can also include possible initialization.
  309.  */
  310. variableDeclarator![AST mods, AST t]
  311. : id:IDENT d:declaratorBrackets[t] v:varInitializer
  312. {#variableDeclarator = #(#[VARIABLE_DEF,"VARIABLE_DEF"], mods, #(#[TYPE,"TYPE"],d), id, v);}
  313. ;
  314. declaratorBrackets[AST typ]
  315. : {#declaratorBrackets=typ;}
  316. (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)*
  317. ;
  318. varInitializer
  319. : ( ASSIGN^ initializer )?
  320. ;
  321. // This is an initializer used to set up an array.
  322. arrayInitializer
  323. : lc:LCURLY^ {#lc.setType(ARRAY_INIT);}
  324. ( initializer
  325. (
  326. // CONFLICT: does a COMMA after an initializer start a new
  327. //           initializer or start the option ',' at end?
  328. //           ANTLR generates proper code by matching
  329. //  the comma as soon as possible.
  330. options {
  331. warnWhenFollowAmbig = false;
  332. }
  333. :
  334. COMMA! initializer
  335. )*
  336. (COMMA!)?
  337. )?
  338. RCURLY!
  339. ;
  340. // The two "things" that can initialize an array element are an expression
  341. //   and another (nested) array initializer.
  342. initializer
  343. : expression
  344. | arrayInitializer
  345. ;
  346. // This is the header of a method.  It includes the name and parameters
  347. //   for the method.
  348. //   This also watches for a list of exception classes in a "throws" clause.
  349. ctorHead
  350. : IDENT  // the name of the method
  351. // parse the formal parameter declarations.
  352. LPAREN! parameterDeclarationList RPAREN!
  353. // get the list of exceptions that this method is declared to throw
  354. (throwsClause)?
  355. ;
  356. // This is a list of exception classes that the method is declared to throw
  357. throwsClause
  358. : "throws"^ identifier ( COMMA! identifier )*
  359. ;
  360. returnTypeBrackersOnEndOfMethodHead[AST typ]
  361. : {#returnTypeBrackersOnEndOfMethodHead = typ;}
  362. (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)*
  363. ;
  364. // A list of formal parameters
  365. parameterDeclarationList
  366. : ( parameterDeclaration ( COMMA! parameterDeclaration )* )?
  367. {#parameterDeclarationList = #(#[PARAMETERS,"PARAMETERS"],
  368. #parameterDeclarationList);}
  369. ;
  370. // A formal parameter.
  371. parameterDeclaration!
  372. : pm:parameterModifier t:typeSpec[false] id:IDENT
  373. pd:parameterDeclaratorBrackets[#t]
  374. {#parameterDeclaration = #(#[PARAMETER_DEF,"PARAMETER_DEF"],
  375. pm, #([TYPE,"TYPE"],pd), id);}
  376. ;
  377. parameterDeclaratorBrackets[AST t]
  378. : {#parameterDeclaratorBrackets = t;}
  379. (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)*
  380. ;
  381. parameterModifier
  382. : (f:"final")?
  383. {#parameterModifier = #(#[MODIFIERS,"MODIFIERS"], f);}
  384. ;
  385. // Compound statement.  This is used in many contexts:
  386. //   Inside a class definition prefixed with "static":
  387. //      it is a class initializer
  388. //   Inside a class definition without "static":
  389. //      it is an instance initializer
  390. //   As the body of a method
  391. //   As a completely indepdent braced block of code inside a method
  392. //      it starts a new scope for variable definitions
  393. compoundStatement
  394. : lc:LCURLY^ {#lc.setType(SLIST);}
  395. // include the (possibly-empty) list of statements
  396. (statement)*
  397. RCURLY!
  398. ;
  399. statement
  400. // A list of statements in curly braces -- start a new scope!
  401. : compoundStatement
  402. // class definition
  403. | classDefinition[#[MODIFIERS, "MODIFIERS"]]
  404. // final class definition
  405. | "final"! classDefinition[#(#[MODIFIERS, "MODIFIERS"],#[FINAL,"final"])]
  406. // abstract class definition
  407. | "abstract"! classDefinition[#(#[MODIFIERS, "MODIFIERS"],#[ABSTRACT,"abstract"])]
  408. // declarations are ambiguous with "ID DOT" relative to expression
  409. // statements.  Must backtrack to be sure.  Could use a semantic
  410. // predicate to test symbol table to see what the type was coming
  411. // up, but that's pretty hard without a symbol table ;)
  412. | (declaration)=> declaration SEMI!
  413. // An expression statement.  This could be a method call,
  414. // assignment statement, or any other expression evaluated for
  415. // side-effects.
  416. | expression SEMI!
  417. // Attach a label to the front of a statement
  418. | IDENT c:COLON^ {#c.setType(LABELED_STAT);} statement
  419. // If-else statement
  420. | "if"^ LPAREN! expression RPAREN! statement
  421. (
  422. // CONFLICT: the old "dangling-else" problem...
  423. //           ANTLR generates proper code matching
  424. //  as soon as possible.  Hush warning.
  425. options {
  426. warnWhenFollowAmbig = false;
  427. }
  428. :
  429. "else"! statement
  430. )?
  431. // For statement
  432. | "for"^
  433. LPAREN!
  434. forInit SEMI!   // initializer
  435. forCond SEMI!   // condition test
  436. forIter         // updater
  437. RPAREN!
  438. statement                     // statement to loop over
  439. // While statement
  440. | "while"^ LPAREN! expression RPAREN! statement
  441. // do-while statement
  442. | "do"^ statement "while"! LPAREN! expression RPAREN! SEMI!
  443. // get out of a loop (or switch)
  444. | "break"^ (IDENT)? SEMI!
  445. // do next iteration of a loop
  446. | "continue"^ (IDENT)? SEMI!
  447. // Return an expression
  448. | "return"^ (expression)? SEMI!
  449. // switch/case statement
  450. | "switch"^ LPAREN! expression RPAREN! LCURLY!
  451. ( casesGroup )*
  452. RCURLY!
  453. // exception try-catch block
  454. | tryBlock
  455. // throw an exception
  456. | "throw"^ expression SEMI!
  457. // synchronize a statement
  458. | "synchronized"^ LPAREN! expression RPAREN! compoundStatement
  459. // empty statement
  460. | s:SEMI {#s.setType(EMPTY_STAT);}
  461. ;
  462. casesGroup
  463. : ( // CONFLICT: to which case group do the statements bind?
  464. //           ANTLR generates proper code: it groups the
  465. //           many "case"/"default" labels together then
  466. //           follows them with the statements
  467. options {
  468. warnWhenFollowAmbig = false;
  469. }
  470. :
  471. aCase
  472. )+
  473. caseSList
  474. {#casesGroup = #([CASE_GROUP, "CASE_GROUP"], #casesGroup);}
  475. ;
  476. aCase
  477. : ("case"^ expression | "default") COLON!
  478. ;
  479. caseSList
  480. : (statement)*
  481. {#caseSList = #(#[SLIST,"SLIST"],#caseSList);}
  482. ;
  483. // The initializer for a for loop
  484. forInit
  485. // if it looks like a declaration, it is
  486. : ( (declaration)=> declaration
  487. // otherwise it could be an expression list...
  488. | expressionList
  489. )?
  490. {#forInit = #(#[FOR_INIT,"FOR_INIT"],#forInit);}
  491. ;
  492. forCond
  493. : (expression)?
  494. {#forCond = #(#[FOR_CONDITION,"FOR_CONDITION"],#forCond);}
  495. ;
  496. forIter
  497. : (expressionList)?
  498. {#forIter = #(#[FOR_ITERATOR,"FOR_ITERATOR"],#forIter);}
  499. ;
  500. // an exception handler try/catch block
  501. tryBlock
  502. : "try"^ compoundStatement
  503. (handler)*
  504. ( "finally"^ compoundStatement )?
  505. ;
  506. // an exception handler
  507. handler
  508. : "catch"^ LPAREN! parameterDeclaration RPAREN! compoundStatement
  509. ;
  510. // expressions
  511. // Note that most of these expressions follow the pattern
  512. //   thisLevelExpression :
  513. //       nextHigherPrecedenceExpression
  514. //           (OPERATOR nextHigherPrecedenceExpression)*
  515. // which is a standard recursive definition for a parsing an expression.
  516. // The operators in java have the following precedences:
  517. //    lowest  (13)  = *= /= %= += -= <<= >>= >>>= &= ^= |=
  518. //            (12)  ?:
  519. //            (11)  ||
  520. //            (10)  &&
  521. //            ( 9)  |
  522. //            ( 8)  ^
  523. //            ( 7)  &
  524. //            ( 6)  == !=
  525. //            ( 5)  < <= > >=
  526. //            ( 4)  << >>
  527. //            ( 3)  +(binary) -(binary)
  528. //            ( 2)  * / %
  529. //            ( 1)  ++ -- +(unary) -(unary)  ~  !  (type)
  530. //                  []   () (method call)  . (dot -- identifier qualification)
  531. //                  new   ()  (explicit parenthesis)
  532. //
  533. // the last two are not usually on a precedence chart; I put them in
  534. // to point out that new has a higher precedence than '.', so you
  535. // can validy use
  536. //     new Frame().show()
  537. // 
  538. // Note that the above precedence levels map to the rules below...
  539. // Once you have a precedence chart, writing the appropriate rules as below
  540. //   is usually very straightfoward
  541. // the mother of all expressions
  542. expression
  543. : assignmentExpression
  544. {#expression = #(#[EXPR,"EXPR"],#expression);}
  545. ;
  546. // This is a list of expressions.
  547. expressionList
  548. : expression (COMMA! expression)*
  549. {#expressionList = #(#[ELIST,"ELIST"], expressionList);}
  550. ;
  551. // assignment expression (level 13)
  552. assignmentExpression
  553. : conditionalExpression
  554. ( ( ASSIGN^
  555.             |   PLUS_ASSIGN^
  556.             |   MINUS_ASSIGN^
  557.             |   STAR_ASSIGN^
  558.             |   DIV_ASSIGN^
  559.             |   MOD_ASSIGN^
  560.             |   SR_ASSIGN^
  561.             |   BSR_ASSIGN^
  562.             |   SL_ASSIGN^
  563.             |   BAND_ASSIGN^
  564.             |   BXOR_ASSIGN^
  565.             |   BOR_ASSIGN^
  566.             )
  567. assignmentExpression
  568. )?
  569. ;
  570. // conditional test (level 12)
  571. conditionalExpression
  572. : logicalOrExpression
  573. ( QUESTION^ assignmentExpression COLON! conditionalExpression )?
  574. ;
  575. // logical or (||)  (level 11)
  576. logicalOrExpression
  577. : logicalAndExpression (LOR^ logicalAndExpression)*
  578. ;
  579. // logical and (&&)  (level 10)
  580. logicalAndExpression
  581. : inclusiveOrExpression (LAND^ inclusiveOrExpression)*
  582. ;
  583. // bitwise or non-short-circuiting or (|)  (level 9)
  584. inclusiveOrExpression
  585. : exclusiveOrExpression (BOR^ exclusiveOrExpression)*
  586. ;
  587. // exclusive or (^)  (level 8)
  588. exclusiveOrExpression
  589. : andExpression (BXOR^ andExpression)*
  590. ;
  591. // bitwise or non-short-circuiting and (&)  (level 7)
  592. andExpression
  593. : equalityExpression (BAND^ equalityExpression)*
  594. ;
  595. // equality/inequality (==/!=) (level 6)
  596. equalityExpression
  597. : relationalExpression ((NOT_EQUAL^ | EQUAL^) relationalExpression)*
  598. ;
  599. // boolean relational expressions (level 5)
  600. relationalExpression
  601. : shiftExpression
  602. ( ( ( LT^
  603. | GT^
  604. | LE^
  605. | GE^
  606. )
  607. shiftExpression
  608. )*
  609. | "instanceof"^ typeSpec[true]
  610. )
  611. ;
  612. // bit shift expressions (level 4)
  613. shiftExpression
  614. : additiveExpression ((SL^ | SR^ | BSR^) additiveExpression)*
  615. ;
  616. // binary addition/subtraction (level 3)
  617. additiveExpression
  618. : multiplicativeExpression ((PLUS^ | MINUS^) multiplicativeExpression)*
  619. ;
  620. // multiplication/division/modulo (level 2)
  621. multiplicativeExpression
  622. : unaryExpression ((STAR^ | DIV^ | MOD^ ) unaryExpression)*
  623. ;
  624. unaryExpression
  625. : INC^ unaryExpression
  626. | DEC^ unaryExpression
  627. | MINUS^ {#MINUS.setType(UNARY_MINUS);} unaryExpression
  628. | PLUS^  {#PLUS.setType(UNARY_PLUS);} unaryExpression
  629. | unaryExpressionNotPlusMinus
  630. ;
  631. unaryExpressionNotPlusMinus
  632. : BNOT^ unaryExpression
  633. | LNOT^ unaryExpression
  634. | ( // subrule allows option to shut off warnings
  635. options {
  636. // "(int" ambig with postfixExpr due to lack of sequence
  637. // info in linear approximate LL(k).  It's ok.  Shut up.
  638. generateAmbigWarnings=false;
  639. }
  640. : // If typecast is built in type, must be numeric operand
  641. // Also, no reason to backtrack if type keyword like int, float...
  642. lpb:LPAREN^ {#lpb.setType(TYPECAST);} builtInTypeSpec[true] RPAREN!
  643. unaryExpression
  644. // Have to backtrack to see if operator follows.  If no operator
  645. // follows, it's a typecast.  No semantic checking needed to parse.
  646. // if it _looks_ like a cast, it _is_ a cast; else it's a "(expr)"
  647. | (LPAREN classTypeSpec[true] RPAREN unaryExpressionNotPlusMinus)=>
  648. lp:LPAREN^ {#lp.setType(TYPECAST);} classTypeSpec[true] RPAREN!
  649. unaryExpressionNotPlusMinus
  650. | postfixExpression
  651. )
  652. ;
  653. // qualified names, array expressions, method invocation, post inc/dec
  654. postfixExpression
  655. : primaryExpression // start with a primary
  656. ( // qualified id (id.id.id.id...) -- build the name
  657. DOT^ ( IDENT
  658. | "this"
  659. | "class"
  660. | newExpression
  661. | "super" LPAREN ( expressionList )? RPAREN
  662. )
  663. // the above line needs a semantic check to make sure "class"
  664. //   is the _last_ qualifier.
  665. // allow ClassName[].class
  666. | ( lbc:LBRACK^ {#lbc.setType(ARRAY_DECLARATOR);} RBRACK! )+
  667. DOT^ "class"
  668. // an array indexing operation
  669. | lb:LBRACK^ {#lb.setType(INDEX_OP);} expression RBRACK!
  670. // method invocation
  671. // The next line is not strictly proper; it allows x(3)(4) or
  672. //  x[2](4) which are not valid in Java.  If this grammar were used
  673. //  to validate a Java program a semantic check would be needed, or
  674. //   this rule would get really ugly...
  675. | lp:LPAREN^ {#lp.setType(METHOD_CALL);}
  676. argList
  677. RPAREN!
  678. )*
  679. // possibly add on a post-increment or post-decrement.
  680. // allows INC/DEC on too much, but semantics can check
  681. ( in:INC^ {#in.setType(POST_INC);}
  682.   | de:DEC^ {#de.setType(POST_DEC);}
  683. | // nothing
  684. )
  685. // look for int.class and int[].class
  686. | builtInType 
  687. ( lbt:LBRACK^ {#lbt.setType(ARRAY_DECLARATOR);} RBRACK! )*
  688. DOT^ "class"
  689. ;
  690. // the basic element of an expression
  691. primaryExpression
  692. : IDENT
  693. | newExpression
  694. | constant
  695. | "super"
  696. | "true"
  697. | "false"
  698. | "this"
  699. | "null"
  700. | LPAREN! assignmentExpression RPAREN!
  701. ;
  702. /** object instantiation.
  703.  *  Trees are built as illustrated by the following input/tree pairs:
  704.  *  
  705.  *  new T()
  706.  *  
  707.  *  new
  708.  *   |
  709.  *   T --  ELIST
  710.  *           |
  711.  *          arg1 -- arg2 -- .. -- argn
  712.  *  
  713.  *  new int[]
  714.  *
  715.  *  new
  716.  *   |
  717.  *  int -- ARRAY_DECLARATOR
  718.  *  
  719.  *  new int[] {1,2}
  720.  *
  721.  *  new
  722.  *   |
  723.  *  int -- ARRAY_DECLARATOR -- ARRAY_INIT
  724.  *                                  |
  725.  *                                EXPR -- EXPR
  726.  *                                  |      |
  727.  *                                  1      2
  728.  *  
  729.  *  new int[3]
  730.  *  new
  731.  *   |
  732.  *  int -- ARRAY_DECLARATOR
  733.  *                |
  734.  *              EXPR
  735.  *                |
  736.  *                3
  737.  *  
  738.  *  new int[1][2]
  739.  *  
  740.  *  new
  741.  *   |
  742.  *  int -- ARRAY_DECLARATOR
  743.  *               |
  744.  *         ARRAY_DECLARATOR -- EXPR
  745.  *               |              |
  746.  *             EXPR             1
  747.  *               |
  748.  *               2
  749.  *  
  750.  */
  751. newExpression
  752. : "new"^ type
  753. ( LPAREN! argList RPAREN! (classBlock)?
  754. //java 1.1
  755. // Note: This will allow bad constructs like
  756. //    new int[4][][3] {exp,exp}.
  757. //    There needs to be a semantic check here...
  758. // to make sure:
  759. //   a) [ expr ] and [ ] are not mixed
  760. //   b) [ expr ] and an init are not used together
  761. | newArrayDeclarator (arrayInitializer)?
  762. )
  763. ;
  764. argList
  765. : ( expressionList
  766. | /*nothing*/
  767. {#argList = #[ELIST,"ELIST"];}
  768. )
  769. ;
  770. newArrayDeclarator
  771. : (
  772. // CONFLICT:
  773. // newExpression is a primaryExpression which can be
  774. // followed by an array index reference.  This is ok,
  775. // as the generated code will stay in this loop as
  776. // long as it sees an LBRACK (proper behavior)
  777. options {
  778. warnWhenFollowAmbig = false;
  779. }
  780. :
  781. lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);}
  782. (expression)?
  783. RBRACK!
  784. )+
  785. ;
  786. constant
  787. : NUM_INT
  788. | CHAR_LITERAL
  789. | STRING_LITERAL
  790. | NUM_FLOAT
  791. ;
  792. //----------------------------------------------------------------------------
  793. // The Java scanner
  794. //----------------------------------------------------------------------------
  795. class JavaLexer extends Lexer;
  796. options {
  797. exportVocab=Java;      // call the vocabulary "Java"
  798. testLiterals=false;    // don't automatically test for literals
  799. k=4;                   // four characters of lookahead
  800. }
  801. // OPERATORS
  802. QUESTION : '?' ;
  803. LPAREN : '(' ;
  804. RPAREN : ')' ;
  805. LBRACK : '[' ;
  806. RBRACK : ']' ;
  807. LCURLY : '{' ;
  808. RCURLY : '}' ;
  809. COLON : ':' ;
  810. COMMA : ',' ;
  811. //DOT : '.' ;
  812. ASSIGN : '=' ;
  813. EQUAL : "==" ;
  814. LNOT : '!' ;
  815. BNOT : '~' ;
  816. NOT_EQUAL : "!=" ;
  817. DIV : '/' ;
  818. DIV_ASSIGN : "/=" ;
  819. PLUS : '+' ;
  820. PLUS_ASSIGN : "+=" ;
  821. INC : "++" ;
  822. MINUS : '-' ;
  823. MINUS_ASSIGN : "-=" ;
  824. DEC : "--" ;
  825. STAR : '*' ;
  826. STAR_ASSIGN : "*=" ;
  827. MOD : '%' ;
  828. MOD_ASSIGN : "%=" ;
  829. SR : ">>" ;
  830. SR_ASSIGN : ">>=" ;
  831. BSR : ">>>" ;
  832. BSR_ASSIGN : ">>>=" ;
  833. GE : ">=" ;
  834. GT : ">" ;
  835. SL : "<<" ;
  836. SL_ASSIGN : "<<=" ;
  837. LE : "<=" ;
  838. LT : '<' ;
  839. BXOR : '^' ;
  840. BXOR_ASSIGN : "^=" ;
  841. BOR : '|' ;
  842. BOR_ASSIGN : "|=" ;
  843. LOR : "||" ;
  844. BAND : '&' ;
  845. BAND_ASSIGN : "&=" ;
  846. LAND : "&&" ;
  847. SEMI : ';' ;
  848. // Whitespace -- ignored
  849. WS : ( ' '
  850. | 't'
  851. | 'f'
  852. // handle newlines
  853. | ( "rn"  // Evil DOS
  854. | 'r'    // Macintosh
  855. | 'n'    // Unix (the right way)
  856. )
  857. { newline(); }
  858. )
  859. { _ttype = Token.SKIP; }
  860. ;
  861. // Single-line comments
  862. SL_COMMENT
  863. : "//"
  864. (~('n'|'r'))* ('n'|'r'('n')?)
  865. {$setType(Token.SKIP); newline();}
  866. ;
  867. // multiple-line comments
  868. ML_COMMENT
  869. : "/*"
  870. ( /* 'r' 'n' can be matched in one alternative or by matching
  871. 'r' in one iteration and 'n' in another.  I am trying to
  872. handle any flavor of newline that comes in, but the language
  873. that allows both "rn" and "r" and "n" to all be valid
  874. newline is ambiguous.  Consequently, the resulting grammar
  875. must be ambiguous.  I'm shutting this warning off.
  876.  */
  877. options {
  878. generateAmbigWarnings=false;
  879. }
  880. :
  881. { LA(2)!='/' }? '*'
  882. | 'r' 'n' {newline();}
  883. | 'r' {newline();}
  884. | 'n' {newline();}
  885. | ~('*'|'n'|'r')
  886. )*
  887. "*/"
  888. {$setType(Token.SKIP);}
  889. ;
  890. // character literals
  891. CHAR_LITERAL
  892. : ''' ( ESC | ~''' ) '''
  893. ;
  894. // string literals
  895. STRING_LITERAL
  896. : '"' (ESC|~('"'|'\'))* '"'
  897. ;
  898. // escape sequence -- note that this is protected; it can only be called
  899. //   from another lexer rule -- it will not ever directly return a token to
  900. //   the parser
  901. // There are various ambiguities hushed in this rule.  The optional
  902. // '0'...'9' digit matches should be matched here rather than letting
  903. // them go back to STRING_LITERAL to be matched.  ANTLR does the
  904. // right thing by matching immediately; hence, it's ok to shut off
  905. // the FOLLOW ambig warnings.
  906. protected
  907. ESC
  908. : '\'
  909. ( 'n'
  910. | 'r'
  911. | 't'
  912. | 'b'
  913. | 'f'
  914. | '"'
  915. | '''
  916. | '\'
  917. | ('u')+ HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
  918. | ('0'..'3')
  919. (
  920. options {
  921. warnWhenFollowAmbig = false;
  922. }
  923. : ('0'..'7')
  924. (
  925. options {
  926. warnWhenFollowAmbig = false;
  927. }
  928. : '0'..'7'
  929. )?
  930. )?
  931. | ('4'..'7')
  932. (
  933. options {
  934. warnWhenFollowAmbig = false;
  935. }
  936. : ('0'..'9')
  937. )?
  938. )
  939. ;
  940. // hexadecimal digit (again, note it's protected!)
  941. protected
  942. HEX_DIGIT
  943. : ('0'..'9'|'A'..'F'|'a'..'f')
  944. ;
  945. // a dummy rule to force vocabulary to be all characters (except special
  946. //   ones that ANTLR uses internally (0 to 2)
  947. protected
  948. VOCAB
  949. : '3'..'377'
  950. ;
  951. // an identifier.  Note that testLiterals is set to true!  This means
  952. // that after we match the rule, we look in the literals table to see
  953. // if it's a literal or really an identifer
  954. IDENT
  955. options {testLiterals=true;}
  956. : ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'$')*
  957. ;
  958. // a numeric literal
  959. NUM_INT
  960. {boolean isDecimal=false;}
  961. : '.' {_ttype = DOT;}
  962. (('0'..'9')+ (EXPONENT)? (FLOAT_SUFFIX)? { _ttype = NUM_FLOAT; })?
  963. | ( '0' {isDecimal = true;} // special case for just '0'
  964. ( ('x'|'X')
  965. ( // hex
  966. // the 'e'|'E' and float suffix stuff look
  967. // like hex digits, hence the (...)+ doesn't
  968. // know when to stop: ambig.  ANTLR resolves
  969. // it correctly by matching immediately.  It
  970. // is therefor ok to hush warning.
  971. options {
  972. warnWhenFollowAmbig=false;
  973. }
  974. : HEX_DIGIT
  975. )+
  976. | ('0'..'7')+ // octal
  977. )?
  978. | ('1'..'9') ('0'..'9')*  {isDecimal=true;} // non-zero decimal
  979. )
  980. ( ('l'|'L')
  981. // only check to see if it's a float if looks like decimal so far
  982. | {isDecimal}?
  983. ( '.' ('0'..'9')* (EXPONENT)? (FLOAT_SUFFIX)?
  984. | EXPONENT (FLOAT_SUFFIX)?
  985. | FLOAT_SUFFIX
  986. )
  987. { _ttype = NUM_FLOAT; }
  988. )?
  989. ;
  990. // a couple protected methods to assist in matching floating point numbers
  991. protected
  992. EXPONENT
  993. : ('e'|'E') ('+'|'-')? ('0'..'9')+
  994. ;
  995. protected
  996. FLOAT_SUFFIX
  997. : 'f'|'F'|'d'|'D'
  998. ;