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

编译器/解释器

开发平台:

Others

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