Author: aadamchik
Date: Mon Aug 21 08:33:48 2006
New Revision: 433264
URL: http://svn.apache.org/viewvc?rev=433264&view=rev
Log:
improving EJBQL parser - still lots of warnings
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/jjtree/JavaCCEJBQLParser.jjt
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/jjtree/JavaCCEJBQLParser.jjt
URL:
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/jjtree/JavaCCEJBQLParser.jjt?rev=433264&r1=433263&r2=433264&view=diff
==============================================================================
---
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/jjtree/JavaCCEJBQLParser.jjt
(original)
+++
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/jjtree/JavaCCEJBQLParser.jjt
Mon Aug 21 08:33:48 2006
@@ -49,6 +49,116 @@
}
PARSER_END(JavaCCEJBQLParser)
+// ======================================================
+// TOKENS
+// ======================================================
+
+SKIP :
+{
+ " "
+| "\t"
+| "\n"
+| "\r"
+}
+
+/* keywords */
+TOKEN :
+{
+ < ALL: "ALL" >
+| < AND: "AND" >
+| < ANY: "ANY" >
+| < AS: "AS" >
+| < ASC: "ASC" >
+| < AVG: "AVG" >
+| < BETWEEN: "BETWEEN" >
+| < BIT_LENGTH: "BIT_LENGTH" >
+| < BY: "BY" >
+| < CHARACTER_LENGTH: "CHARACTER_LENGTH" >
+| < CHAR_LENGTH: "CHAR_LENGTH" >
+| < COUNT: "COUNT" >
+| < CURRENT_DATE: "CURRENT_DATE" >
+| < CURRENT_TIME: "CURRENT_TIME" >
+| < CURRENT_TIMESTAMP: "CURRENT_TIMESTAMP" >
+| < DELETE: "DELETE" >
+| < DESC: "DESC" >
+| < DISTINCT: "DISTINCT" >
+| < EMPTY: "EMPTY" >
+| < EXISTS: "EXISTS" >
+| < FALSE: "FASLE" >
+| < FETCH: "FETCH" >
+| < FROM: "FROM" >
+| < GROUP: "GROUP" >
+| < HAVING: "HAVING" >
+| < IN: "IN" >
+| < INNER: "INNER" >
+| < IS: "IS" >
+| < JOIN: "JOIN" >
+| < LEFT: "LEFT" >
+| < LIKE: "LIKE" >
+| < LOWER: "LOWER" >
+| < MAX: "MAX" >
+| < MEMBER: "MEMBER" >
+| < MIN: "MIN" >
+| < MOD: "MOD" >
+| < NEW: "NEW" >
+| < NOT: "NOT" >
+| < NULL: "NULL" >
+| < OBJECT: "OBJECT" >
+| < OF: "OF" >
+| < ORDER: "ORDER" >
+| < OR: "OR" >
+| < OUTER: "OUTER" >
+| < POSITION: "POSITION" >
+| < SELECT: "SELECT" >
+| < SET: "SET" >
+| < SOME: "SOME" >
+| < SUM: "SUM" >
+| < TRIM: "TRIM" >
+| < TRUE: "TRUE" >
+| < WHERE: "WHERE" >
+| < UNKNOWN: "UNKNOWN" >
+| < UPDATE: "UPDATE" >
+| < UPPER: "UPPER" >
+}
+
+TOKEN :
+{
+ < TRIM_SPEC: "LEADING" | "TRAILING" | "BOTH" (~["\n","\r"])? >
+| < ESCAPE_SPEC: "ESCAPE" (~["\n","\r"])? >
+| < PROPERTY_PATH: <IDENTIFIER> ( "." <IDENTIFIER>) *>
+| < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+| < #LETTER: ["_","$","a"-"z","A"-"Z"] >
+| < #DIGIT: ["0"-"9"] >
+| < DECIMAL_DIGITS: (["0"-"9"])+ >
+}
+
+MORE:
+{
+ "'" { stringBuffer = new StringBuffer(); }: WithinSingleQuoteLiteral
+}
+
+<WithinSingleQuoteLiteral> MORE:
+{
+ < ESC: "\\" ( ["n","r","t","b","f","\\","'","`","\""]
+ | (["0"-"3"])? ["0"-"7"] (["0"-"7"])?
+ )
+ >
+ { stringBuffer.append( escapeChar() ); }
+ |
+ < (~["'","\\"]) >
+ { stringBuffer.append( image.charAt(image.length()-1) ); }
+}
+
+<WithinSingleQuoteLiteral> TOKEN :
+{
+ <SINGLE_QUOTED_STRING: "'">
+ : DEFAULT
+}
+
+// ======================================================
+// GRAMMAR
+// ======================================================
+
QLStatement qlStatement() : {}
{
@@ -84,7 +194,7 @@
void fromClause() : {}
{
- "FROM"
+ <FROM>
identificationVariableDeclaration()
( ","
( identificationVariableDeclaration()
@@ -105,7 +215,7 @@
void rangeVariableDeclaration() : {}
{
abstractSchemaName()
- ["AS"]
+ [<AS>]
identificationVariable()
}
@@ -113,14 +223,14 @@
{
joinSpec()
joinAssociationPathExpression()
- ["AS"]
+ [<AS>]
identificationVariable()
}
void fetchJoin() : {}
{
joinSpec()
- "FETCH"
+ <FETCH>
joinAssociationPathExpression()
}
@@ -135,10 +245,10 @@
void joinSpec() : {}
{
[
- ( "LEFT" [ "OUTER" ] )
- | "INNER"
+ ( <LEFT> [ <OUTER> ] )
+ | <INNER>
]
- "JOIN"
+ <JOIN>
}
void joinAssociationPathExpression() : {}
@@ -151,21 +261,21 @@
void collectionMemberDeclaration() : {}
{
- "IN ("
+ <IN> "("
<PROPERTY_PATH> // **** SPEC NOTE: defined as
"colection_valued_path_expression"
")"
- [ "AS" ]
+ [ <AS> ]
identificationVariable()
}
void updateClause() : {}
{
- "UPDATE"
+ <UPDATE>
abstractSchemaName()
- [ [ "AS" ]
+ [ [ <AS> ]
identificationVariable()
]
- "SET"
+ <SET>
updateItem()
( ","
updateItem()
@@ -186,27 +296,28 @@
void newValue() : {}
{
simpleArithmeticExpression()
- // | stringPrimary()
- // | datetimePrimary()
- // | booleanPrimary()
- // | enumPrimary()
- // | simpleEntityExpression()
- | "NULL"
+ | stringLiteral()
+ | functionsReturningDatetime()
+ | aggregateExpression()
+ | booleanLiteral()
+ | inputParameter()
+ | enumLiteral()
+ | <NULL>
}
void deleteClause() : {}
{
- "DELETE" "FROM"
+ <DELETE> <FROM>
abstractSchemaName()
- [ [ "AS" ]
+ [ [ <AS> ]
identificationVariable()
]
}
void selectClause() : {}
{
- "SELECT"
- [ "DISTINCT" ]
+ <SELECT>
+ [ <DISTINCT> ]
selectExpression()
( ","
selectExpression()
@@ -217,7 +328,7 @@
{
<PROPERTY_PATH> // **** SPEC NOTE: defined as
"single_valued_path_expression | identification_variable"
| aggregateExpression()
- | ( "OBJECT("
+ | ( "OBJECT" "("
identificationVariable()
")"
)
@@ -267,13 +378,13 @@
void whereClause() : {}
{
- "WHERE"
+ <WHERE>
conditionalExpression()
}
void groupByClause() : {}
{
- "GROUP" "BY"
+ <GROUP> <BY>
groupByItem()
( ","
groupByItem()
@@ -287,12 +398,12 @@
void havingClause() : {}
{
- "HAVING" conditionalExpression()
+ <HAVING> // conditionalExpression()
}
void orderByClause() : {}
{
- "ORDER BY"
+ <ORDER> <BY>
orderByItem()
( ","
orderByItem()
@@ -310,13 +421,13 @@
simpleSelectClause()
subqueryFromClause()
[ whereClause() ]
- [ groupByClause() ]
- [ havingClause() ]
+ [ LOOKAHEAD(2) groupByClause() ]
+ [ LOOKAHEAD(2) havingClause() ]
}
void subqueryFromClause() : {}
{
- "FROM"
+ <FROM>
subselectIdentificationVariableDeclaration()
( "," subselectIdentificationVariableDeclaration()
)*
@@ -326,7 +437,7 @@
{
identificationVariableDeclaration()
| ( associationPathExpression()
- [ "AS" ]
+ [ <AS> ]
identificationVariable()
)
| collectionMemberDeclaration()
@@ -334,8 +445,8 @@
void simpleSelectClause() : {}
{
- "SELECT"
- [ "DISTINCT" ]
+ <SELECT>
+ [ <DISTINCT> ]
simpleSelectExpression()
}
@@ -348,7 +459,7 @@
void conditionalExpression() : {}
{
conditionalTerm()
- ( "OR"
+ ( LOOKAHEAD(2) <OR>
conditionalTerm()
)*
}
@@ -356,14 +467,14 @@
void conditionalTerm() : {}
{
conditionalFactor()
- ( "AND"
+ ( LOOKAHEAD(2) <AND>
conditionalFactor()
)*
}
void conditionalFactor() : {}
{
- [ "NOT" ]
+ [ <NOT> ]
conditionalPrimary()
}
@@ -378,7 +489,7 @@
void simpleCondExpression() : {}
{
- comparisonExpression()
+ LOOKAHEAD(3) comparisonExpression()
| LOOKAHEAD(3) betweenExpression()
| LOOKAHEAD(3) likeExpression()
| LOOKAHEAD(3) inExpression()
@@ -390,30 +501,27 @@
void betweenExpression() : {}
{
- ( arithmeticExpression()
- ( [ "NOT" ]
- "BETWEEN"
- )
- arithmeticExpression()
- "AND"
- arithmeticExpression()
- )
- | ( stringExpression()
- ( [ "NOT" ]
- "BETWEEN"
- )
- stringExpression()
- "AND"
- stringExpression()
- )
- | ( datetimeExpression()
- ( [ "NOT" ]
- "BETWEEN"
- )
- datetimeExpression()
- "AND"
- datetimeExpression()
- )
+ ( LOOKAHEAD(2) arithmeticPrimary()
+ | stringLiteral()
+ | functionsReturningDatetime()
+ | ( "(" subquery() ")" )
+ )
+
+ [ "NOT" ] "BETWEEN"
+
+ ( LOOKAHEAD(2) arithmeticPrimary()
+ | stringLiteral()
+ | functionsReturningDatetime()
+ | ( "(" subquery() ")" )
+ )
+
+ "AND"
+
+ ( LOOKAHEAD(2) arithmeticPrimary()
+ | stringLiteral()
+ | functionsReturningDatetime()
+ | ( "(" subquery() ")" )
+ )
}
void inExpression() : {}
@@ -439,13 +547,14 @@
void likeExpression() : {}
{
- stringExpression()
- [ "NOT" ]
- "LIKE"
+ ( stringPrimary()
+ | ( "(" subquery() ")" )
+ )
+
+ [ <NOT> ]
+ <LIKE>
patternValue()
- [ "ESCAPE"
- escapeCharacter()
- ]
+ [ <ESCAPE_SPEC>]
}
void nullComparisonExpression() : {}
@@ -467,7 +576,7 @@
void collectionMemberExpression() : {}
{
- entityExpression()
+ <PROPERTY_PATH> // **** SPEC NOTE: defined as "entity_expression"
[ "NOT" ]
"MEMBER"
[ "OF" ]
@@ -476,16 +585,16 @@
void existsExpression() : {}
{
- [ "NOT" ]
- "EXISTS"
+ [ <NOT> ]
+ <EXISTS>
subquery()
}
void allOrAnyExpression() : {}
{
- ( "ALL"
- | "ANY"
- | "SOME"
+ ( <ALL>
+ | <ANY>
+ | <SOME>
)
"("
subquery()
@@ -494,47 +603,23 @@
void comparisonExpression() : {}
{
- ( stringExpression()
- comparisonOperator()
- ( stringExpression()
- | allOrAnyExpression()
- )
- )
- | ( booleanExpression()
- ( "="
- | "<>"
- )
- ( booleanExpression()
- | allOrAnyExpression()
- )
- )
- | ( enumExpression()
- ( "="
- | "<>"
- )
- ( enumExpression()
- | allOrAnyExpression()
- )
- )
- | ( datetimeExpression()
- comparisonOperator()
- ( datetimeExpression()
- | allOrAnyExpression()
- )
- )
- | ( entityExpression()
- ( "="
- | "<>"
- )
- ( entityExpression()
- | allOrAnyExpression()
- )
+ // must enforce comparison type rules in the code - it is impossible to do
it in the parser.
+
+ ( stringLiteral()
+ | booleanLiteral()
+ | functionsReturningDatetime()
+ | LOOKAHEAD(2) simpleArithmeticExpression()
+ | LOOKAHEAD(2) ( "(" subquery() ")" )
)
- | ( arithmeticExpression()
- comparisonOperator()
- ( arithmeticExpression()
- | allOrAnyExpression()
- )
+
+ comparisonOperator()
+
+ ( stringLiteral()
+ | booleanLiteral()
+ | functionsReturningDatetime()
+ | LOOKAHEAD(2) simpleArithmeticExpression()
+ | LOOKAHEAD(2) ( "(" subquery() ")" )
+ | allOrAnyExpression()
)
}
@@ -548,16 +633,6 @@
| "<>"
}
-void arithmeticExpression() : {}
-{
- LOOKAHEAD(2)
- simpleArithmeticExpression()
- | ( "("
- subquery()
- ")"
- )
-}
-
void simpleArithmeticExpression() : {}
{
arithmeticTerm()
@@ -593,8 +668,7 @@
{
<PROPERTY_PATH> // **** SPEC NOTE: defined as
"state_field_path_expression"
| numericLiteral()
- | (
- "("
+ | ( "("
simpleArithmeticExpression()
")"
)
@@ -603,15 +677,6 @@
| aggregateExpression()
}
-void stringExpression() : {}
-{
- stringPrimary()
- | ( "("
- subquery()
- ")"
- )
-}
-
void stringPrimary() : {}
{
<PROPERTY_PATH> // **** SPEC NOTE: defined as
"state_field_path_expression"
@@ -621,66 +686,6 @@
| aggregateExpression()
}
-void datetimeExpression() : {}
-{
- datetimePrimary()
- | ( "("
- subquery()
- ")"
- )
-}
-
-void datetimePrimary() : {}
-{
- <PROPERTY_PATH> // **** SPEC NOTE: defined as
"state_field_path_expression"
- | inputParameter()
- | functionsReturningDatetime()
- | aggregateExpression()
-}
-
-void booleanExpression() : {}
-{
- booleanPrimary()
- | ( "("
- subquery()
- ")"
- )
-}
-
-void booleanPrimary() : {}
-{
- <PROPERTY_PATH> // **** SPEC NOTE: defined as
"state_field_path_expression"
- | booleanLiteral()
- | inputParameter()
-}
-
-void enumExpression() : {}
-{
- enumPrimary()
- | ( "("
- subquery()
- ")"
- )
-}
-
-void enumPrimary() : {}
-{
- <PROPERTY_PATH> // **** SPEC NOTE: defined as
"state_field_path_expression"
- | enumLiteral()
- | inputParameter()
-}
-
-void entityExpression() : {}
-{
- <PROPERTY_PATH> // **** SPEC NOTE: defined as
"single_valued_association_path_expression | simple_entity_expression"
-}
-
-void simpleEntityExpression() : {}
-{
- identificationVariable()
- | inputParameter()
-}
-
void functionsReturningNumerics() : {}
{
( "LENGTH("
@@ -739,11 +744,10 @@
simpleArithmeticExpression()
")"
)
- | ( "TRIM("
+ | ( <TRIM> "("
[
[ trimSpecification() ]
- [ trimCharacter() ]
- "FROM"
+ <FROM>
]
stringPrimary()
")"
@@ -760,9 +764,7 @@
void trimSpecification() : {}
{
- "LEADING"
- | "TRAILING"
- | "BOTH"
+ <TRIM_SPEC>
}
void abstractSchemaName() : {}
@@ -811,8 +813,8 @@
void booleanLiteral() : {}
{
- "TRUE"
- | "FALSE"
+ <TRUE>
+ | <FALSE>
}
void constructorName() : {}
@@ -820,66 +822,7 @@
<IDENTIFIER>
}
-void trimCharacter() : {}
-{
- <ANY_CHAR>
-}
-
-void escapeCharacter() : {}
-{
- <ANY_CHAR>
-}
-
void patternValue() : {}
{
stringLiteral()
}
-
-// **** TOKENS ****
-
-SKIP :
-{
- " "
-| "\t"
-| "\n"
-| "\r"
-}
-
-TOKEN :
-{
- < PROPERTY_PATH: <IDENTIFIER> ( "." <IDENTIFIER>) *>
-|
- < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
-|
- < #LETTER: ["_","$","a"-"z","A"-"Z"] >
-|
- < #DIGIT: ["0"-"9"] >
-|
- < DECIMAL_DIGITS: (["0"-"9"])+ >
-|
- < ANY_CHAR: ~["\n","\r"]>
-}
-
-
-MORE:
-{
- "'" { stringBuffer = new StringBuffer(); }: WithinSingleQuoteLiteral
-}
-
-<WithinSingleQuoteLiteral> MORE:
-{
- < ESC: "\\" ( ["n","r","t","b","f","\\","'","`","\""]
- | (["0"-"3"])? ["0"-"7"] (["0"-"7"])?
- )
- >
- { stringBuffer.append( escapeChar() ); }
- |
- < (~["'","\\"]) >
- { stringBuffer.append( image.charAt(image.length()-1) ); }
-}
-
-<WithinSingleQuoteLiteral> TOKEN :
-{
- <SINGLE_QUOTED_STRING: "'">
- : DEFAULT
-}
\ No newline at end of file