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

编译器/解释器

开发平台:

Others

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