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

编译器/解释器

开发平台:

Others

  1. options {
  2. language="Cpp";
  3. }
  4. /** Java 1.1 Recognizer Grammar
  5.  *
  6.  * Run 'java JavaRecognizer <directory full of java files>'
  7.  *
  8.  * 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.  *
  14.  * Version 1.00 December 9, 1997 -- initial release
  15.  * Version 1.01 December 10, 1997
  16.  * fixed bug in octal def (0..7 not 0..8)
  17.  * Version 1.10 August 1998 (parrt)
  18.  * added tree construction
  19.  * fixed definition of WS_,comments for mac,pc,unix newlines
  20.  * added unary plus
  21.  * Version 1.11 (Nov 20, 1998)
  22.  * Added "shutup" option to turn off last ambig warning.
  23.  * Fixed inner class def to allow named class defs as statements
  24.  * synchronized requires compound not simple statement
  25.  * add [] after builtInType DOT class in primaryExpression
  26.  * "const" is reserved but not valid..removed from modifiers
  27.  *
  28.  * This grammar is in the PUBLIC DOMAIN
  29.  *
  30.  * BUGS
  31.  * (expression) + "string" is parsed incorrectly (+ as unary plus).
  32.  *
  33.  */
  34. class JavaRecognizer extends Parser;
  35. options {
  36. k = 2;                           // two token lookahead
  37. exportVocab=Java;            // Call its vocabulary "Java"
  38. codeGenMakeSwitchThreshold = 2;  // Some optimizations
  39. codeGenBitsetTestThreshold = 3;
  40. defaultErrorHandler = false;     // Don't generate parser error handlers
  41. buildAST = true;
  42. }
  43. imaginaryTokenDefinitions
  44. : BLOCK MODIFIERS OBJBLOCK SLIST CTOR_DEF METHOD_DEF VARIABLE_DEF
  45. INSTANCE_INIT STATIC_INIT TYPE CLASS_DEF INTERFACE_DEF
  46. PACKAGE_DEF ARRAY_DECLARATOR EXTENDS_CLAUSE IMPLEMENTS_CLAUSE
  47. PARAMETERS PARAMETER_DEF LABELED_STAT TYPECAST INDEX_OP
  48. POST_INC POST_DEC METHOD_CALL EXPR ARRAY_INIT
  49. IMPORT UNARY_MINUS UNARY_PLUS CASE_GROUP ELIST FOR_INIT FOR_CONDITION
  50. FOR_ITERATOR EMPTY_STAT
  51. ;
  52. // Compilation Unit: In Java, this is a single file.  This is the start
  53. //   rule for this parser
  54. compilationUnit
  55. : // A compilation unit starts with an optional package definition
  56. ( packageDefinition
  57. | /* nothing */
  58. )
  59. // Next we have a series of zero or more import statements
  60. ( importDefinition )*
  61. // Wrapping things up with any number of class or interface
  62. //    definitions
  63. ( typeDefinition )*
  64. EOF!
  65. ;
  66. // Package statement: "package" followed by an identifier.
  67. packageDefinition
  68. options {defaultErrorHandler = true;} // let ANTLR handle errors
  69. : p:"package"^ {#p->setType(PACKAGE_DEF);} identifier SEMI!
  70. ;
  71. // Import statement: import followed by a package or class name
  72. importDefinition
  73. options {defaultErrorHandler = true;}
  74. : i:"import"^ {#i->setType(IMPORT);} identifierStar SEMI!
  75. ;
  76. // A type definition in a file is either a class or interface definition.
  77. typeDefinition
  78. options {defaultErrorHandler = true;}
  79. : m:modifiers!
  80. ( classDefinition[#m]
  81. | interfaceDefinition[#m]
  82. )
  83. | SEMI!
  84. ;
  85. /** A declaration is the creation of a reference or primitive-type variable
  86.  *  Create a separate Type/Var tree for each var in the var list.
  87.  */
  88. declaration!
  89. : m:modifiers t:typeSpec[false] v:variableDefinitions[#m,#t]
  90. {#declaration = #v;}
  91. ;
  92. /* A declaration with no modifiers
  93. localVariableDeclaration
  94. : t:typeSpec[false] v:variableDefinitions[#[MODIFIERS, "MODIFIERS"],#t]
  95. {#localVariableDeclaration = #v;}
  96. ;
  97.  */
  98. // A list of zero or more modifiers.  We could have used (modifier)* in
  99. //   place of a call to modifiers, but I thought it was a good idea to keep
  100. //   this rule separate so they can easily be collected in a Vector if
  101. //   someone so desires
  102. modifiers
  103. : ( modifier )*
  104. {#modifiers = #([MODIFIERS, "MODIFIERS"], #modifiers);}
  105. ;
  106. // A type specification is a type name with possible brackets afterwards
  107. //   (which would make it an array type).
  108. typeSpec[bool addImagNode]
  109. : type (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
  110. {
  111. if ( addImagNode ) {
  112. #typeSpec = #(#[TYPE,"TYPE"], #typeSpec);
  113. }
  114. }
  115. ;
  116. // A type name. which is either a (possibly qualified) class name or
  117. //   a primitive (builtin) type
  118. type
  119. : identifier
  120. | builtInType
  121. ;
  122. // The primitive types.
  123. builtInType
  124. : "void"
  125. | "boolean"
  126. | "byte"
  127. | "char"
  128. | "short"
  129. | "int"
  130. | "float"
  131. | "long"
  132. | "double"
  133. ;
  134. // A (possibly-qualified) java identifier.  We start with the first IDENT
  135. //   and expand its name by adding dots and following IDENTS
  136. identifier
  137. : IDENT  ( DOT^ IDENT )*
  138. ;
  139. identifierStar
  140. : IDENT
  141. ( DOT^ IDENT )*
  142. ( DOT^ STAR  )?
  143. ;
  144. // modifiers for Java classes, interfaces, class/instance vars and methods
  145. modifier
  146. : "private"
  147. | "public"
  148. | "protected"
  149. | "static"
  150. | "transient"
  151. | "final"
  152. | "abstract"
  153. | "native"
  154. | "threadsafe"
  155. | "synchronized"
  156. // | "const" // reserved word; leave out
  157. | "volatile"
  158. ;
  159. // Definition of a Java class
  160. classDefinition![ANTLR_USE_NAMESPACE(antlr)RefAST modifiers]
  161. : "class" IDENT
  162. // it _might_ have a superclass...
  163. sc:superClassClause
  164. // it might implement some interfaces...
  165. ic:implementsClause
  166. // now parse the body of the class
  167. cb:classBlock
  168. {#classDefinition = #(#[CLASS_DEF,"CLASS_DEF"],
  169.    modifiers,IDENT,sc,ic,cb);}
  170. ;
  171. superClassClause!
  172. : ( "extends" id:identifier )?
  173. {#superClassClause = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"],id);}
  174. ;
  175. // Definition of a Java Interface
  176. interfaceDefinition![ANTLR_USE_NAMESPACE(antlr)RefAST modifiers]
  177. : "interface" IDENT
  178. // it might extend some other interfaces
  179. (ie:interfaceExtends)?
  180. // now parse the body of the interface (looks like a class...)
  181. cb:classBlock
  182. {#interfaceDefinition = #(#[INTERFACE_DEF,"INTERFACE_DEF"],
  183. modifiers,IDENT,ie,cb);}
  184. ;
  185. // This is the body of a class.  You can have fields and extra semicolons,
  186. // That's about it (until you see what a field is...)
  187. classBlock
  188. : LCURLY!
  189. ( field | SEMI )*
  190. RCURLY!
  191. {#classBlock = #([OBJBLOCK, "OBJBLOCK"], #classBlock);}
  192. ;
  193. // An interface can extend several other interfaces...
  194. interfaceExtends
  195. : e:"extends" {#e->setType(EXTENDS_CLAUSE);}
  196. identifier ( COMMA! identifier )*
  197. ;
  198. // A class can implement several interfaces...
  199. implementsClause
  200. : (
  201. i:"implements"! identifier ( COMMA! identifier )*
  202. )?
  203. {#implementsClause = #(#[IMPLEMENTS_CLAUSE,"IMPLEMENTS_CLAUSE"],
  204.  #implementsClause);}
  205. ;
  206. // Now the various things that can be defined inside a class or interface...
  207. // Note that not all of these are really valid in an interface (constructors,
  208. //   for example), and if this grammar were used for a compiler there would
  209. //   need to be some semantic checks to make sure we're doing the right thing...
  210. field!
  211. : // method, constructor, or variable declaration
  212. mods:modifiers
  213. ( h:ctorHead s:compoundStatement // constructor
  214. {#field = #(#[CTOR_DEF,"CTOR_DEF"], mods, h, s);}
  215. | cd:classDefinition[#mods]       // inner class
  216. {#field = #cd;}
  217. | id:interfaceDefinition[#mods]   // inner interface
  218. {#field = #id;}
  219. | t:typeSpec[false]  // method or variable declaration(s)
  220. ( IDENT  // the name of the method
  221. // parse the formal parameter declarations.
  222. LPAREN! param:parameterDeclarationList RPAREN!
  223. rt:returnTypeBrackersOnEndOfMethodHead[#t]
  224. // get the list of exceptions that this method is declared to throw
  225. (tc:throwsClause)?
  226. ( s2:compoundStatement | SEMI )
  227. {#field = #(#[METHOD_DEF,"METHOD_DEF"],
  228.      mods,
  229.  #(#[TYPE,"TYPE"],rt),
  230.  IDENT,
  231.  param,
  232.  tc,
  233.  s2);}
  234. | v:variableDefinitions[#mods,#t] SEMI
  235. // {#field = #(#[VARIABLE_DEF,"VARIABLE_DEF"], v);}
  236. {#field = #v;}
  237. )
  238. )
  239.     // "static { ... }" class initializer
  240. | "static" s3:compoundStatement
  241. {#field = #(#[STATIC_INIT,"STATIC_INIT"], s3);}
  242.     // "{ ... }" instance initializer
  243. | compoundStatement
  244. {#field = #(#[INSTANCE_INIT,"INSTANCE_INIT"], s3);}
  245. ;
  246. variableDefinitions[ANTLR_USE_NAMESPACE(antlr)RefAST mods, ANTLR_USE_NAMESPACE(antlr)RefAST t]
  247. : variableDeclarator[getASTFactory().dupTree(mods),
  248.    getASTFactory().dupTree(t)]
  249. ( COMMA!
  250. variableDeclarator[getASTFactory().dupTree(mods),
  251.    getASTFactory().dupTree(t)]
  252. )*
  253. ;
  254. /** Declaration of a variable.  This can be a class/instance variable,
  255.  *   or a local variable in a method
  256.  * It can also include possible initialization.
  257.  */
  258. variableDeclarator![ANTLR_USE_NAMESPACE(antlr)RefAST mods, ANTLR_USE_NAMESPACE(antlr)RefAST t]
  259. : id:IDENT d:declaratorBrackets[t] v:varInitializer
  260. {#variableDeclarator = #(#[VARIABLE_DEF,"VARIABLE_DEF"], mods, #(#[TYPE,"TYPE"],d), id, v);}
  261. ;
  262. declaratorBrackets[ANTLR_USE_NAMESPACE(antlr)RefAST typ]
  263. : {#declaratorBrackets=typ;}
  264. (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
  265. ;
  266. varInitializer
  267. : ( ASSIGN^ initializer )?
  268. ;
  269. // This is an initializer used to set up an array.
  270. arrayInitializer
  271. : lc:LCURLY^ {#lc->setType(ARRAY_INIT);}
  272. ( initializer
  273. (
  274. // CONFLICT: does a COMMA after an initializer start a new
  275. //           initializer or start the option ',' at end?
  276. //           ANTLR generates proper code by matching
  277. //  the comma as soon as possible.
  278. options {
  279. warnWhenFollowAmbig = false;
  280. }
  281. :
  282. COMMA! initializer
  283. )*
  284. (COMMA!)?
  285. )?
  286. RCURLY!
  287. ;
  288. // The two "things" that can initialize an array element are an expression
  289. //   and another (nested) array initializer.
  290. initializer
  291. : expression
  292. | arrayInitializer
  293. ;
  294. // This is the header of a method.  It includes the name and parameters
  295. //   for the method.
  296. //   This also watches for a list of exception classes in a "throws" clause.
  297. ctorHead
  298. : IDENT  // the name of the method
  299. // parse the formal parameter declarations.
  300. LPAREN! parameterDeclarationList RPAREN!
  301. // get the list of exceptions that this method is declared to throw
  302. (throwsClause)?
  303. ;
  304. // This is a list of exception classes that the method is declared to throw
  305. throwsClause
  306. : "throws"^ identifier ( COMMA! identifier )*
  307. ;
  308. returnTypeBrackersOnEndOfMethodHead[ANTLR_USE_NAMESPACE(antlr)RefAST typ]
  309. : {#returnTypeBrackersOnEndOfMethodHead = typ;}
  310. (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
  311. ;
  312. // A list of formal parameters
  313. parameterDeclarationList
  314. : ( parameterDeclaration ( COMMA! parameterDeclaration )* )?
  315. {#parameterDeclarationList = #(#[PARAMETERS,"PARAMETERS"],
  316. #parameterDeclarationList);}
  317. ;
  318. // A formal parameter.
  319. parameterDeclaration!
  320. : pm:parameterModifier t:typeSpec[false] id:IDENT
  321. pd:parameterDeclaratorBrackets[#t]
  322. {#parameterDeclaration = #(#[PARAMETER_DEF,"PARAMETER_DEF"],
  323. pm, #([TYPE,"TYPE"],pd), id);}
  324. ;
  325. parameterDeclaratorBrackets[ANTLR_USE_NAMESPACE(antlr)RefAST t]
  326. : {#parameterDeclaratorBrackets = t;}
  327. (lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK!)*
  328. ;
  329. parameterModifier
  330. : (f:"final")?
  331. {#parameterModifier = #(#[MODIFIERS,"MODIFIERS"], f);}
  332. ;
  333. // Compound statement.  This is used in many contexts:
  334. //   Inside a class definition prefixed with "static":
  335. //      it is a class initializer
  336. //   Inside a class definition without "static":
  337. //      it is an instance initializer
  338. //   As the body of a method
  339. //   As a completely indepdent braced block of code inside a method
  340. //      it starts a new scope for variable definitions
  341. compoundStatement
  342. : lc:LCURLY^ {#lc->setType(SLIST);}
  343. // include the (possibly-empty) list of statements
  344. (statement)*
  345. RCURLY!
  346. ;
  347. statement
  348. // A list of statements in curly braces -- start a new scope!
  349. : compoundStatement
  350. // class definition (no modifiers allowed; pass empty list)
  351. | classDefinition[#[MODIFIERS, "MODIFIERS"]]
  352. // interface definition (no modifiers allowed; pass empty list)
  353. | interfaceDefinition[#[MODIFIERS, "MODIFIERS"]]
  354. // declarations are ambiguous with "ID DOT" relative to expression
  355. // statements.  Must backtrack to be sure.  Could use a semantic
  356. // predicate to test symbol table to see what the type was coming
  357. // up, but that's pretty hard without a symbol table ;)
  358. // | (localVariableDeclaration)=> localVariableDeclaration SEMI!
  359. | (declaration)=> declaration SEMI!
  360. // An expression statement.  This could be a method call,
  361. // assignment statement, or any other expression evaluated for
  362. // side-effects.
  363. | expression SEMI!
  364. // Attach a label to the front of a statement
  365. | IDENT c:COLON^ {#c->setType(LABELED_STAT);} statement
  366. // If-else statement
  367. | "if"^ LPAREN! expression RPAREN! statement
  368. (
  369. // CONFLICT: the old "dangling-else" problem...
  370. //           ANTLR generates proper code matching
  371. //  as soon as possible.  Hush warning.
  372. options {
  373. warnWhenFollowAmbig = false;
  374. }
  375. :
  376. "else"! statement
  377. )?
  378. // For statement
  379. | "for"^
  380. LPAREN!
  381. forInit SEMI!   // initializer
  382. forCond SEMI!   // condition test
  383. forIter         // updater
  384. RPAREN!
  385. statement                     // statement to loop over
  386. // While statement
  387. | "while"^ LPAREN! expression RPAREN! statement
  388. // do-while statement
  389. | "do"^ statement "while"! LPAREN! expression RPAREN! SEMI!
  390. // get out of a loop (or switch)
  391. | "break"^ (IDENT)? SEMI!
  392. // do next iteration of a loop
  393. | "continue"^ (IDENT)? SEMI!
  394. // Return an expression
  395. | "return"^ (expression)? SEMI!
  396. // switch/case statement
  397. | "switch"^ LPAREN! expression RPAREN! LCURLY!
  398. ( casesGroup )*
  399. RCURLY!
  400. // exception try-catch block
  401. | tryBlock
  402. // throw an exception
  403. | "throw"^ expression SEMI!
  404. // synchronize a statement
  405. | "synchronized"^ LPAREN! expression RPAREN! compoundStatement
  406. // empty statement
  407. | s:SEMI {#s->setType(EMPTY_STAT);}
  408. ;
  409. casesGroup
  410. : ( // CONFLICT: to which case group do the statements bind?
  411. //           ANTLR generates proper code: it groups the
  412. //           many "case"/"default" labels together then
  413. //           follows them with the statements
  414. options {
  415. warnWhenFollowAmbig = false;
  416. }
  417. :
  418. aCase
  419. )+
  420. caseSList
  421. {#casesGroup = #([CASE_GROUP, "CASE_GROUP"], #casesGroup);}
  422. ;
  423. aCase
  424. : ("case"^ expression | "default") COLON!
  425. ;
  426. caseSList
  427. : (statement)*
  428. {#caseSList = #(#[SLIST,"SLIST"],#caseSList);}
  429. ;
  430. // The initializer for a for loop
  431. forInit
  432. // if it looks like a declaration, it is
  433. : ( (declaration)=> declaration
  434. // otherwise it could be an expression list...
  435. | expressionList
  436. )?
  437. {#forInit = #(#[FOR_INIT,"FOR_INIT"],#forInit);}
  438. ;
  439. forCond
  440. : (expression)?
  441. {#forCond = #(#[FOR_CONDITION,"FOR_CONDITION"],#forCond);}
  442. ;
  443. forIter
  444. : (expressionList)?
  445. {#forIter = #(#[FOR_ITERATOR,"FOR_ITERATOR"],#forIter);}
  446. ;
  447. // an exception handler try/catch block
  448. tryBlock
  449. : "try"^ compoundStatement
  450. (handler)*
  451. ( "finally"^ compoundStatement )?
  452. ;
  453. // an exception handler
  454. handler
  455. : "catch"^ LPAREN! parameterDeclaration RPAREN! compoundStatement
  456. ;
  457. // expressions
  458. // Note that most of these expressions follow the pattern
  459. //   thisLevelExpression :
  460. //       nextHigherPrecedenceExpression
  461. //           (OPERATOR nextHigherPrecedenceExpression)*
  462. // which is a standard recursive definition for a parsing an expression.
  463. // The operators in java have the following precedences:
  464. //    lowest  (13)  = *= /= %= += -= <<= >>= >>>= &= ^= |=
  465. //            (12)  ?:
  466. //            (11)  ||
  467. //            (10)  &&
  468. //            ( 9)  |
  469. //            ( 8)  ^
  470. //            ( 7)  &
  471. //            ( 6)  == !=
  472. //            ( 5)  < <= > >=
  473. //            ( 4)  << >>
  474. //            ( 3)  +(binary) -(binary)
  475. //            ( 2)  * / %
  476. //            ( 1)  ++ -- +(unary) -(unary)  ~  !  (type)
  477. //                  []   () (method call)  . (dot -- identifier qualification)
  478. //                  new   ()  (explicit parenthesis)
  479. //
  480. // the last two are not usually on a precedence chart; I put them in
  481. // to point out that new has a higher precedence than '.', so you
  482. // can validy use
  483. //     new Frame().show()
  484. // 
  485. // Note that the above precedence levels map to the rules below...
  486. // Once you have a precedence chart, writing the appropriate rules as below
  487. //   is usually very straightfoward
  488. // the mother of all expressions
  489. expression
  490. : assignmentExpression
  491. {#expression = #(#[EXPR,"EXPR"],#expression);}
  492. ;
  493. // This is a list of expressions.
  494. expressionList
  495. : expression (COMMA! expression)*
  496. {#expressionList = #(#[ELIST,"ELIST"], expressionList);}
  497. ;
  498. // assignment expression (level 13)
  499. assignmentExpression
  500. : conditionalExpression
  501. ( ( ASSIGN^
  502.             |   PLUS_ASSIGN^
  503.             |   MINUS_ASSIGN^
  504.             |   STAR_ASSIGN^
  505.             |   DIV_ASSIGN^
  506.             |   MOD_ASSIGN^
  507.             |   SR_ASSIGN^
  508.             |   BSR_ASSIGN^
  509.             |   SL_ASSIGN^
  510.             |   BAND_ASSIGN^
  511.             |   BXOR_ASSIGN^
  512.             |   BOR_ASSIGN^
  513.             )
  514. assignmentExpression
  515. )?
  516. ;
  517. // conditional test (level 12)
  518. conditionalExpression
  519. : logicalOrExpression
  520. ( QUESTION^ conditionalExpression COLON! conditionalExpression )?
  521. ;
  522. // logical or (||)  (level 11)
  523. logicalOrExpression
  524. : logicalAndExpression (LOR^ logicalAndExpression)*
  525. ;
  526. // logical and (&&)  (level 10)
  527. logicalAndExpression
  528. : inclusiveOrExpression (LAND^ inclusiveOrExpression)*
  529. ;
  530. // bitwise or non-short-circuiting or (|)  (level 9)
  531. inclusiveOrExpression
  532. : exclusiveOrExpression (BOR^ exclusiveOrExpression)*
  533. ;
  534. // exclusive or (^)  (level 8)
  535. exclusiveOrExpression
  536. : andExpression (BXOR^ andExpression)*
  537. ;
  538. // bitwise or non-short-circuiting and (&)  (level 7)
  539. andExpression
  540. : equalityExpression (BAND^ equalityExpression)*
  541. ;
  542. // equality/inequality (==/!=) (level 6)
  543. equalityExpression
  544. : relationalExpression ((NOT_EQUAL^ | EQUAL^) relationalExpression)*
  545. ;
  546. // boolean relational expressions (level 5)
  547. relationalExpression
  548. : shiftExpression
  549. ( ( LT_^
  550. | GT^
  551. | LE^
  552. | GE^
  553. )
  554. shiftExpression
  555. )*
  556. ;
  557. // bit shift expressions (level 4)
  558. shiftExpression
  559. : additiveExpression ((SL^ | SR^ | BSR^) additiveExpression)*
  560. ;
  561. // binary addition/subtraction (level 3)
  562. additiveExpression
  563. : multiplicativeExpression ((PLUS^ | MINUS^) multiplicativeExpression)*
  564. ;
  565. // multiplication/division/modulo (level 2)
  566. multiplicativeExpression
  567. : castExpression ((STAR^ | DIV^ | MOD^ ) castExpression)*
  568. ;
  569. // cast/unary (level 1)
  570. castExpression
  571. // if it _looks_ like a cast, it _is_ a cast
  572. : ( LPAREN typeSpec[true] RPAREN castExpression )=>
  573. lp:LPAREN^ {#lp->setType(TYPECAST);} typeSpec[true] RPAREN!
  574. c:castExpression
  575. // otherwise it's a unary expression
  576. | INC^ castExpression
  577. | DEC^ castExpression
  578. | MINUS^ {#MINUS->setType(UNARY_MINUS);} castExpression
  579. | PLUS^  {#PLUS->setType(UNARY_PLUS);} castExpression
  580. | BNOT^ castExpression
  581. | LNOT^ castExpression
  582. | postfixExpression ( "instanceof"^ typeSpec[true] )?
  583. // instanceof should not allow just primitives (x instanceof int)
  584. // need a semantic check if we're compiling...
  585. ;
  586. // qualified names, array expressions, method invocation, post inc/dec
  587. postfixExpression
  588. : primaryExpression // start with a primary
  589. ( // qualified id (id.id.id.id...) -- build the name
  590. DOT^ ( IDENT
  591. | "this"
  592. | "class"
  593. | newExpression
  594. | "super" LPAREN ( expressionList )? RPAREN
  595. )
  596. // the above line needs a semantic check to make sure "class"
  597. //   is the _last_ qualifier.
  598. // an array indexing operation
  599. | lb:LBRACK^ {#lb->setType(INDEX_OP);} expression RBRACK!
  600. // method invocation
  601. // The next line is not strictly proper; it allows x(3)(4) or
  602. //   x[2](4) which are not valid in Java.  If this grammar were used
  603. //   to validate a Java program a semantic check would be needed, or
  604. //   this rule would get really ugly...
  605. | lp:LPAREN^ {#lp->setType(METHOD_CALL);}
  606. argList
  607. RPAREN!
  608. )*
  609. // possibly add on a post-increment or post-decrement
  610. ( in:INC^ {#in->setType(POST_INC);}
  611.   | de:DEC^ {#de->setType(POST_DEC);}
  612. | // nothing
  613. )
  614. ;
  615. // the basic element of an expression
  616. primaryExpression
  617. : IDENT
  618. | builtInType 
  619. ( lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);} RBRACK! )*
  620. DOT^ "class"
  621. | newExpression
  622. | constant
  623. | "super"
  624. | "true"
  625. | "false"
  626. | "this"
  627. | "null"
  628. | LPAREN! assignmentExpression RPAREN!
  629. ;
  630. /** object instantiation.
  631.  *  Trees are built as illustrated by the following input/tree pairs:
  632.  *  
  633.  *  new T()
  634.  *  
  635.  *  new
  636.  *   |
  637.  *   T --  ELIST
  638.  *           |
  639.  *          arg1 -- arg2 -- .. -- argn
  640.  *  
  641.  *  new int[]
  642.  *
  643.  *  new
  644.  *   |
  645.  *  int -- ARRAY_DECLARATOR
  646.  *  
  647.  *  new int[] {1,2}
  648.  *
  649.  *  new
  650.  *   |
  651.  *  int -- ARRAY_DECLARATOR -- ARRAY_INIT
  652.  *                                  |
  653.  *                                EXPR -- EXPR
  654.  *                                  |      |
  655.  *                                  1      2
  656.  *  
  657.  *  new int[3]
  658.  *  new
  659.  *   |
  660.  *  int -- ARRAY_DECLARATOR
  661.  *                |
  662.  *              EXPR
  663.  *                |
  664.  *                3
  665.  *  
  666.  *  new int[1][2]
  667.  *  
  668.  *  new
  669.  *   |
  670.  *  int -- ARRAY_DECLARATOR
  671.  *               |
  672.  *         ARRAY_DECLARATOR -- EXPR
  673.  *               |              |
  674.  *             EXPR             1
  675.  *               |
  676.  *               2
  677.  *  
  678.  */
  679. newExpression
  680. : "new"^ type
  681. ( LPAREN! argList RPAREN! (classBlock)?
  682. //java 1.1
  683. // Note: This will allow bad constructs like
  684. //    new int[4][][3] {exp,exp}.
  685. //    There needs to be a semantic check here...
  686. // to make sure:
  687. //   a) [ expr ] and [ ] are not mixed
  688. //   b) [ expr ] and an init are not used together
  689. | newArrayDeclarator (arrayInitializer)?
  690. )
  691. ;
  692. argList
  693. : ( expressionList
  694. | /*nothing*/
  695. {#argList = #[ELIST,"ELIST"];}
  696. )
  697. ;
  698. newArrayDeclarator
  699. : (
  700. // CONFLICT:
  701. // newExpression is a primaryExpression which can be
  702. // followed by an array index reference.  This is ok,
  703. // as the generated code will stay in this loop as
  704. // long as it sees an LBRACK (proper behavior)
  705. options {
  706. warnWhenFollowAmbig = false;
  707. }
  708. :
  709. lb:LBRACK^ {#lb->setType(ARRAY_DECLARATOR);}
  710. (expression)?
  711. RBRACK!
  712. )+
  713. ;
  714. constant
  715. : NUM_INT
  716. | CHAR_LITERAL
  717. | STRING_LITERAL
  718. | NUM_FLOAT
  719. ;