pmd/pmd-jerry/etc/grammar/XPath2.jjt
Ryan Gustafson eafe5af965 Updated XPath2 grammar to use already defined tokens.
Completed translation of abbreviated XPath2 into XPath/XQuery Core.  Full of tons of bugs I'm sure!  Working on a Core parser next.

git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@5444 51baf565-9d33-0410-a72c-fc3788e3496d
2007-08-03 07:48:23 +00:00

1570 lines
34 KiB
Plaintext

/**
* This is a JavaCC JJTree grammar file for XPath 2.0, the specification of which can be found at:
* http://www.w3.org/TR/xpath20
*
* While this grammar was independently written, it does borrow some of the concepts used with
* the test grammar available at:
* http://www.w3.org/2006/11/applets/xpathApplet.html
* But where that grammar provides no explaination of what is going on, this grammar contains a
* fair bit of instruction.
*/
// TODO Document reason for these choices
options
{
CACHE_TOKENS = true;
STATIC = false;
MULTI = true;
VISITOR = true;
NODE_USES_PARSER = true;
NODE_PACKAGE="net.sourceforge.pmd.jerry.ast.xpath";
DEBUG_PARSER = false;
DEBUG_LOOKAHEAD = false;
DEBUG_TOKEN_MANAGER = false;
}
PARSER_BEGIN(XPath2Parser)
package net.sourceforge.pmd.jerry.ast.xpath;
import java.util.Stack;
import net.sourceforge.pmd.jerry.xpath.AxisEnum;
import net.sourceforge.pmd.jerry.xpath.OperatorEnum;
public class XPath2Parser
{
//
// TODO
// Check to ensure the final lexical state not inside a comment.
// This would indicate an unbalanced comment.
//
}
PARSER_END(XPath2Parser)
TOKEN_MGR_DECLS :
{
// Support for managing nested lexical states.
private Stack lexStateStack = new Stack();
/**
* Push the current lexical state onto the state stack.
*/
private void pushLexState()
{
lexStateStack.push(new Integer(curLexState));
}
/**
* Pop a lexical state off the state stack, and switch to that lexical state.
*/
private void popLexState()
{
int lexState = ((Integer)lexStateStack.pop()).intValue();
SwitchTo(lexState);
}
}
/**
* Tokens follow. XPath 2.0 categorizes tokens as delimiting and
* non-delimiting, see http://www.w3.org/TR/xpath20/#id-terminal-delimitation
* To manage this distinction in tokens, we will use two major lexical
* states to indicate when delimiting or non-delimiting terminal symbol
* (aka tokens) are acceptable.
*
* The DEFAULT state will represent that the next token may be a delimiting
* terminal symbol, a non-delimiting terminal symbol, or a symbol separator.
*
* The DELIMITING state will represent that the next token must be a delimiting
* terminal symbol or a symbol separator (whitespace or comment).
*/
// TODO How do we handle "." and "-" when following a QName/NCName?
// TODO How do we handle "." when preceding/following a numeric literal?
//
// See the following concerning whitespace:
// http://www.w3.org/TR/xpath20/#whitespace-rules
// http://www.w3.org/TR/REC-xml/#NT-S
//
// Note: Whitespace is consider a symbol separator.
//
<DEFAULT, DELIMITING>
SPECIAL_TOKEN :
{
" " : DEFAULT
|
"\t" : DEFAULT
|
"\n" : DEFAULT
|
"\r" : DEFAULT
}
//
// The following are delimiting terminal symbols. Matching one of these
// tokens means the next allowable terminal symbol may be a delimiting
// terminal symbol, a non-delimiting terminal symbol, or a symbol separator.
//
<DEFAULT, DELIMITING>
TOKEN :
{
<MINUS : "-" > : DEFAULT
|
<COMMA : "," > : DEFAULT
|
<COLON : ":" > : DEFAULT
|
<COLON_COLON : "::" > : DEFAULT
|
<BANG_EQUAL : "!=" > : DEFAULT
|
<QUESTION_MARK : "?" > : DEFAULT
|
<SLASH : "/" > : DEFAULT
|
<SLASH_SLASH : "//" > : DEFAULT
|
<DOT : "." > : DEFAULT
|
<DOT_DOT : ".." > : DEFAULT
|
<OPEN_PAREN : "(" > : DEFAULT
|
<CLOSE_PAREN : ")" > : DEFAULT
|
<OPEN_BRACKET : "[" > : DEFAULT
|
<CLOSE_BRACKET : "]" > : DEFAULT
|
<AT : "@" > : DEFAULT
|
<DOLLAR : "$" > : DEFAULT
|
<STAR : "*" > : DEFAULT
|
<PLUS : "+" > : DEFAULT
|
<LESSER_THAN : "<" > : DEFAULT
|
<PRECEEDS_OPERATOR : "<<" > : DEFAULT
|
<LESSER_THAN_EQUAL : "<=" > : DEFAULT
|
<EQUAL : "=" > : DEFAULT
|
<GREATER_THAN : ">" > : DEFAULT
|
<GREATER_THAN_EQUAL : ">=" > : DEFAULT
|
<FOLLOWS_OPERATOR : ">>" > : DEFAULT
|
<PIPE : "|" > : DEFAULT
|
<STRING_LITERAL : ("\"" (<ESCAPE_QUOT> | ~["\""])* "\"") | ("'" (<ESCAPE_APOS> | ~["'"])* "'") > : DEFAULT
|
<#ESCAPE_QUOT : "\"\"" >
|
<#ESCAPE_APOS : "''" >
}
//
// The following are non-delimiting terminal symbols. Matching one of these
// tokens means the next allowable terminal symbol must be a delimiting
// terminal symbol or a symbol separator (whitespace or comment).
//
<DEFAULT>
TOKEN :
{
<KEYWORD_ANCESTOR : "ancestor" > : DELIMITING
|
<KEYWORD_ANCESTOR_OR_SELF : "ancestor-or-self" > : DELIMITING
|
<KEYWORD_AND : "and" > : DELIMITING
|
<KEYWORD_AS : "as" > : DELIMITING
|
<KEYWORD_ATTRIBUTE : "attribute" > : DELIMITING
|
<KEYWORD_CAST : "cast" > : DELIMITING
|
<KEYWORD_CASTABLE : "castable" > : DELIMITING
|
<KEYWORD_CHILD : "child" > : DELIMITING
|
<KEYWORD_COMMENT : "comment" > : DELIMITING
|
<KEYWORD_DESCENDANT : "descendant" > : DELIMITING
|
<KEYWORD_DESCENDANT_OR_SELF : "descendant-or-self" > : DELIMITING
|
<KEYWORD_DIV : "div" > : DELIMITING
|
<KEYWORD_DOCUMENT_NODE : "document-node" > : DELIMITING
|
<KEYWORD_ELEMENT : "element" > : DELIMITING
|
<KEYWORD_ELSE : "else" > : DELIMITING
|
<KEYWORD_EMPTY_SEQUENCE : "empty-sequence" > : DELIMITING
|
<KEYWORD_EQ : "eq" > : DELIMITING
|
<KEYWORD_EVERY : "every" > : DELIMITING
|
<KEYWORD_EXCEPT : "except" > : DELIMITING
|
<KEYWORD_EXTERNAL : "external" > : DELIMITING
|
<KEYWORD_FOLLOWING : "following" > : DELIMITING
|
<KEYWORD_FOLLOWING_SIBLING : "following-sibling" > : DELIMITING
|
<KEYWORD_FOR : "for" > : DELIMITING
|
<KEYWORD_GE : "ge" > : DELIMITING
|
<KEYWORD_GT : "gt" > : DELIMITING
|
<KEYWORD_IDIV : "idiv" > : DELIMITING
|
<KEYWORD_IF : "if" > : DELIMITING
|
<KEYWORD_IN : "in" > : DELIMITING
|
<KEYWORD_INSTANCE : "instance" > : DELIMITING
|
<KEYWORD_INTERSECT : "intersect" > : DELIMITING
|
<KEYWORD_IS : "is" > : DELIMITING
|
<KEYWORD_ITEM : "item" > : DELIMITING
|
<KEYWORD_LE : "le" > : DELIMITING
|
<KEYWORD_LT : "lt" > : DELIMITING
|
<KEYWORD_MOD : "mod" > : DELIMITING
|
<KEYWORD_NAMESPACE : "namespace" > : DELIMITING
|
<KEYWORD_NE : "ne" > : DELIMITING
|
<KEYWORD_NODE : "node" > : DELIMITING
|
<KEYWORD_OF : "of" > : DELIMITING
|
<KEYWORD_OR : "or" > : DELIMITING
|
<KEYWORD_PARENT : "parent" > : DELIMITING
|
<KEYWORD_PRECEDING : "preceding" > : DELIMITING
|
<KEYWORD_PRECEDING_SIBLING : "preceding-sibling" > : DELIMITING
|
<KEYWORD_PROCESSING_INSTRUCTION : "processing-instruction" > : DELIMITING
|
<KEYWORD_RETURN : "return" > : DELIMITING
|
<KEYWORD_SATISFIES : "satisfies" > : DELIMITING
|
<KEYWORD_SCHEMA_ATTRIBUTE : "schema-attribute" > : DELIMITING
|
<KEYWORD_SCHEMA_ELEMENT : "schema-element" > : DELIMITING
|
<KEYWORD_SELF : "self" > : DELIMITING
|
<KEYWORD_SOME : "some" > : DELIMITING
|
<KEYWORD_TEXT : "text" > : DELIMITING
|
<KEYWORD_THEN : "then" > : DELIMITING
|
<KEYWORD_TO : "to" > : DELIMITING
|
<KEYWORD_TREAT : "treat" > : DELIMITING
|
<KEYWORD_UNION : "union" > : DELIMITING
|
// TODO Continue from here
<INTEGER_LITERAL : <DIGITS> > : DELIMITING
|
<DECIMAL_LITERAL : ("." <DIGITS>) | (<DIGITS> "." (["0"-"9"])*) > : DELIMITING
|
<DOUBLE_LITERAL : (("." <DIGITS>) | (<DIGITS> ("." (["0"-"9"])*)?)) ["e","E"] (["+","-"])? <DIGITS> > : DELIMITING
|
<#DIGITS : (["0"-"9"])+ >
|
<QNAME :
(<NCNAME> ":" <NCNAME>) | <NCNAME>
>
|
<NCNAME :
<NCNAMESTARTCHAR> (<NCNAMECHAR>)*
>
|
<#NCNAMECHAR :
// Note: JavaCC cannot do <NAMECHAR> - ":", duplicate <NAMECHAR> here with ":" removed
<LETTER> | <DIGIT> | "." | "-" | "_" | <COMBININGCHAR> | <EXTENDER>
>
|
<#NCNAMESTARTCHAR :
<LETTER> | "_"
>
|
<#NAMECHAR :
<LETTER> | <DIGIT> | "." | "-" | "_" | ":" | <COMBININGCHAR> | <EXTENDER>
>
|
<#LETTER :
<BASECHAR> | <IDEOGRAPHIC>
>
|
<#BASECHAR :
[
"\u0041"-"\u005A",
"\u0061"-"\u007A",
"\u00C0"-"\u00D6",
"\u00D8"-"\u00F6",
"\u00F8"-"\u00FF",
"\u0100"-"\u0131",
"\u0134"-"\u013E",
"\u0141"-"\u0148",
"\u014A"-"\u017E",
"\u0180"-"\u01C3",
"\u01CD"-"\u01F0",
"\u01F4"-"\u01F5",
"\u01FA"-"\u0217",
"\u0250"-"\u02A8",
"\u02BB"-"\u02C1",
"\u0386",
"\u0388"-"\u038A",
"\u038C",
"\u038E"-"\u03A1",
"\u03A3"-"\u03CE",
"\u03D0"-"\u03D6",
"\u03DA",
"\u03DC",
"\u03DE",
"\u03E0",
"\u03E2"-"\u03F3",
"\u0401"-"\u040C",
"\u040E"-"\u044F",
"\u0451"-"\u045C",
"\u045E"-"\u0481",
"\u0490"-"\u04C4",
"\u04C7"-"\u04C8",
"\u04CB"-"\u04CC",
"\u04D0"-"\u04EB",
"\u04EE"-"\u04F5",
"\u04F8"-"\u04F9",
"\u0531"-"\u0556",
"\u0559",
"\u0561"-"\u0586",
"\u05D0"-"\u05EA",
"\u05F0"-"\u05F2",
"\u0621"-"\u063A",
"\u0641"-"\u064A",
"\u0671"-"\u06B7",
"\u06BA"-"\u06BE",
"\u06C0"-"\u06CE",
"\u06D0"-"\u06D3",
"\u06D5",
"\u06E5"-"\u06E6",
"\u0905"-"\u0939",
"\u093D",
"\u0958"-"\u0961",
"\u0985"-"\u098C",
"\u098F"-"\u0990",
"\u0993"-"\u09A8",
"\u09AA"-"\u09B0",
"\u09B2",
"\u09B6"-"\u09B9",
"\u09DC"-"\u09DD",
"\u09DF"-"\u09E1",
"\u09F0"-"\u09F1",
"\u0A05"-"\u0A0A",
"\u0A0F"-"\u0A10",
"\u0A13"-"\u0A28",
"\u0A2A"-"\u0A30",
"\u0A32"-"\u0A33",
"\u0A35"-"\u0A36",
"\u0A38"-"\u0A39",
"\u0A59"-"\u0A5C",
"\u0A5E",
"\u0A72"-"\u0A74",
"\u0A85"-"\u0A8B",
"\u0A8D",
"\u0A8F"-"\u0A91",
"\u0A93"-"\u0AA8",
"\u0AAA"-"\u0AB0",
"\u0AB2"-"\u0AB3",
"\u0AB5"-"\u0AB9",
"\u0ABD",
"\u0AE0",
"\u0B05"-"\u0B0C",
"\u0B0F"-"\u0B10",
"\u0B13"-"\u0B28",
"\u0B2A"-"\u0B30",
"\u0B32"-"\u0B33",
"\u0B36"-"\u0B39",
"\u0B3D",
"\u0B5C"-"\u0B5D",
"\u0B5F"-"\u0B61",
"\u0B85"-"\u0B8A",
"\u0B8E"-"\u0B90",
"\u0B92"-"\u0B95",
"\u0B99"-"\u0B9A",
"\u0B9C",
"\u0B9E"-"\u0B9F",
"\u0BA3"-"\u0BA4",
"\u0BA8"-"\u0BAA",
"\u0BAE"-"\u0BB5",
"\u0BB7"-"\u0BB9",
"\u0C05"-"\u0C0C",
"\u0C0E"-"\u0C10",
"\u0C12"-"\u0C28",
"\u0C2A"-"\u0C33",
"\u0C35"-"\u0C39",
"\u0C60"-"\u0C61",
"\u0C85"-"\u0C8C",
"\u0C8E"-"\u0C90",
"\u0C92"-"\u0CA8",
"\u0CAA"-"\u0CB3",
"\u0CB5"-"\u0CB9",
"\u0CDE",
"\u0CE0"-"\u0CE1",
"\u0D05"-"\u0D0C",
"\u0D0E"-"\u0D10",
"\u0D12"-"\u0D28",
"\u0D2A"-"\u0D39",
"\u0D60"-"\u0D61",
"\u0E01"-"\u0E2E",
"\u0E30",
"\u0E32"-"\u0E33",
"\u0E40"-"\u0E45",
"\u0E81"-"\u0E82",
"\u0E84",
"\u0E87"-"\u0E88",
"\u0E8A",
"\u0E8D",
"\u0E94"-"\u0E97",
"\u0E99"-"\u0E9F",
"\u0EA1"-"\u0EA3",
"\u0EA5",
"\u0EA7",
"\u0EAA"-"\u0EAB",
"\u0EAD"-"\u0EAE",
"\u0EB0",
"\u0EB2"-"\u0EB3",
"\u0EBD",
"\u0EC0"-"\u0EC4",
"\u0F40"-"\u0F47",
"\u0F49"-"\u0F69",
"\u10A0"-"\u10C5",
"\u10D0"-"\u10F6",
"\u1100",
"\u1102"-"\u1103",
"\u1105"-"\u1107",
"\u1109",
"\u110B"-"\u110C",
"\u110E"-"\u1112",
"\u113C",
"\u113E",
"\u1140",
"\u114C",
"\u114E",
"\u1150",
"\u1154"-"\u1155",
"\u1159",
"\u115F"-"\u1161",
"\u1163",
"\u1165",
"\u1167",
"\u1169",
"\u116D"-"\u116E",
"\u1172"-"\u1173",
"\u1175",
"\u119E",
"\u11A8",
"\u11AB",
"\u11AE"-"\u11AF",
"\u11B7"-"\u11B8",
"\u11BA",
"\u11BC"-"\u11C2",
"\u11EB",
"\u11F0",
"\u11F9",
"\u1E00"-"\u1E9B",
"\u1EA0"-"\u1EF9",
"\u1F00"-"\u1F15",
"\u1F18"-"\u1F1D",
"\u1F20"-"\u1F45",
"\u1F48"-"\u1F4D",
"\u1F50"-"\u1F57",
"\u1F59",
"\u1F5B",
"\u1F5D",
"\u1F5F"-"\u1F7D",
"\u1F80"-"\u1FB4",
"\u1FB6"-"\u1FBC",
"\u1FBE",
"\u1FC2"-"\u1FC4",
"\u1FC6"-"\u1FCC",
"\u1FD0"-"\u1FD3",
"\u1FD6"-"\u1FDB",
"\u1FE0"-"\u1FEC",
"\u1FF2"-"\u1FF4",
"\u1FF6"-"\u1FFC",
"\u2126",
"\u212A"-"\u212B",
"\u212E",
"\u2180"-"\u2182",
"\u3041"-"\u3094",
"\u30A1"-"\u30FA",
"\u3105"-"\u312C",
"\uAC00"-"\uD7A3"
]
>
|
<#IDEOGRAPHIC :
[
"\u4E00"-"\u9FA5",
"\u3007",
"\u3021"-"\u3029"
]
>
|
<#COMBININGCHAR :
[
"\u0300"-"\u0345",
"\u0360"-"\u0361",
"\u0483"-"\u0486",
"\u0591"-"\u05A1",
"\u05A3"-"\u05B9",
"\u05BB"-"\u05BD",
"\u05BF",
"\u05C1"-"\u05C2",
"\u05C4",
"\u064B"-"\u0652",
"\u0670",
"\u06D6"-"\u06DC",
"\u06DD"-"\u06DF",
"\u06E0"-"\u06E4",
"\u06E7"-"\u06E8",
"\u06EA"-"\u06ED",
"\u0901"-"\u0903",
"\u093C",
"\u093E"-"\u094C",
"\u094D",
"\u0951"-"\u0954",
"\u0962"-"\u0963",
"\u0981"-"\u0983",
"\u09BC",
"\u09BE",
"\u09BF",
"\u09C0"-"\u09C4",
"\u09C7"-"\u09C8",
"\u09CB"-"\u09CD",
"\u09D7",
"\u09E2"-"\u09E3",
"\u0A02",
"\u0A3C",
"\u0A3E",
"\u0A3F",
"\u0A40"-"\u0A42",
"\u0A47"-"\u0A48",
"\u0A4B"-"\u0A4D",
"\u0A70"-"\u0A71",
"\u0A81"-"\u0A83",
"\u0ABC",
"\u0ABE"-"\u0AC5",
"\u0AC7"-"\u0AC9",
"\u0ACB"-"\u0ACD",
"\u0B01"-"\u0B03",
"\u0B3C",
"\u0B3E"-"\u0B43",
"\u0B47"-"\u0B48",
"\u0B4B"-"\u0B4D",
"\u0B56"-"\u0B57",
"\u0B82"-"\u0B83",
"\u0BBE"-"\u0BC2",
"\u0BC6"-"\u0BC8",
"\u0BCA"-"\u0BCD",
"\u0BD7",
"\u0C01"-"\u0C03",
"\u0C3E"-"\u0C44",
"\u0C46"-"\u0C48",
"\u0C4A"-"\u0C4D",
"\u0C55"-"\u0C56",
"\u0C82"-"\u0C83",
"\u0CBE"-"\u0CC4",
"\u0CC6"-"\u0CC8",
"\u0CCA"-"\u0CCD",
"\u0CD5"-"\u0CD6",
"\u0D02"-"\u0D03",
"\u0D3E"-"\u0D43",
"\u0D46"-"\u0D48",
"\u0D4A"-"\u0D4D",
"\u0D57",
"\u0E31",
"\u0E34"-"\u0E3A",
"\u0E47"-"\u0E4E",
"\u0EB1",
"\u0EB4"-"\u0EB9",
"\u0EBB"-"\u0EBC",
"\u0EC8"-"\u0ECD",
"\u0F18"-"\u0F19",
"\u0F35",
"\u0F37",
"\u0F39",
"\u0F3E",
"\u0F3F",
"\u0F71"-"\u0F84",
"\u0F86"-"\u0F8B",
"\u0F90"-"\u0F95",
"\u0F97",
"\u0F99"-"\u0FAD",
"\u0FB1"-"\u0FB7",
"\u0FB9",
"\u20D0"-"\u20DC",
"\u20E1",
"\u302A"-"\u302F",
"\u3099",
"\u309A"
]
>
|
<#DIGIT :
[
"\u0030"-"\u0039",
"\u0660"-"\u0669",
"\u06F0"-"\u06F9",
"\u0966"-"\u096F",
"\u09E6"-"\u09EF",
"\u0A66"-"\u0A6F",
"\u0AE6"-"\u0AEF",
"\u0B66"-"\u0B6F",
"\u0BE7"-"\u0BEF",
"\u0C66"-"\u0C6F",
"\u0CE6"-"\u0CEF",
"\u0D66"-"\u0D6F",
"\u0E50"-"\u0E59",
"\u0ED0"-"\u0ED9",
"\u0F20"-"\u0F29"
]
>
|
<#EXTENDER :
[
"\u00B7",
"\u02D0",
"\u02D1",
"\u0387",
"\u0640",
"\u0E46",
"\u0EC6",
"\u3005",
"\u3031"-"\u3035",
"\u309D"-"\u309E",
"\u30FC"-"\u30FE"
]
>
|
<#CHAR :
"\t" | "\n" | "\r" | ["\u0020"-"\uD7FF"] | ["\uE000"-"\uFFFD"]
>
}
//
// The following will handle comments.
//
<DEFAULT, DELIMITING>
SPECIAL_TOKEN:
{
<COMMENT : <COMMENT_START> (<COMMENT_CONTENTS>)* <COMMENT_END> > : DEFAULT
}
// Handles start of comment, and puts us into the INSIDE_COMMENT lexical state
<DEFAULT, DELIMITING, INSIDE_COMMENT>
SPECIAL_TOKEN:
{
<COMMENT_START :
"(:"
>
{
// Push the lexical state
pushLexState();
}
:
INSIDE_COMMENT
}
<INSIDE_COMMENT>
SPECIAL_TOKEN:
{
<COMMENT_CONTENTS :
<CHAR>
>
}
// Handles end of comment, and restores us into the prior lexical state.
<INSIDE_COMMENT>
SPECIAL_TOKEN:
{
<COMMENT_END :
":)"
>
{
// Pop the lexical state, restoring prior state. This supports nested comments.
popLexState();
}
}
/**
* XPath 2.0 grammar follows.
*
* Instead of constructing an AST which contains nodes for every matching
* grammar production, various optimizations are being performed.
*
* The first category of optimizations is to never produce an AST node
* for certain grammar productions by using #void suppression. These are
* productions which can be omitted from the AST such that the AST can
* still be properly interpreted without undo burden. The grammar
* productions where this is being done are:
*
* ExprSingle
* SimpleForClause
* ValueExpr
* GeneralComp
* ValueComp
* NodeComp
* RelativePathExpr
* FilterExpr
* AxisStep
* ForwardStep
* ReverseStep
* PrimaryExpr
* Literal
* NumericLiteral
* KindTest
*
* The second category of optimizations is to omit unnecessary AST nodes
* for unary/binary grammar productions, unless there are at least one/two
* meaningful operands for the production. The grammar productions where
* this is being done are:
*
* OrExpr
* AndExpr
* ComparisonExpr
* RangeExpr
* AdditiveExpr
* MultiplicativeExpr
* UnionExpr
* IntersectExceptExpr
* InstanceofExpr
* TreatExpr
* CastableExpr
* CastExpr
* UnaryExpr
* PathExpr
* PredicateList
* Predicate
*
* The third category of optimizations are Path related. The / and //
* terminals are being produced as AST nodes in PathExpr and // alone
* in RelativePathExpr. This makes life easier, and is consistent
* with having an AST node for independent meaningful grammar productions.
*/
// [1] http://www.w3.org/TR/xpath20/#doc-xpath-XPath
ASTXPath XPath() :
{
}
{
Expr()
<EOF>
{
// Check for unterminated comment
if (XPath2ParserConstants.INSIDE_COMMENT == this.token_source.curLexState)
{
throw new ParseException("Unterminated comment.");
}
return jjtThis;
}
}
// [2] http://www.w3.org/TR/xpath20/#prod-xpath-Expr
void Expr() :
{
}
{
ExprSingle() (<COMMA> ExprSingle())*
}
// [3] http://www.w3.org/TR/xpath20/#doc-xpath-ExprSingle
void ExprSingle() #void :
{
}
{
ForExpr()
|
QuantifiedExpr()
|
IfExpr()
|
OrExpr()
}
// [4] http://www.w3.org/TR/xpath20/#doc-xpath-ForExpr
void ForExpr() :
{
}
{
SimpleForClause() <KEYWORD_RETURN> ExprSingle()
}
// [5] http://www.w3.org/TR/xpath20/#prod-xpath-SimpleForClause
void SimpleForClause() #void :
{
}
{
<KEYWORD_FOR> <DOLLAR> VarName() <KEYWORD_IN> ExprSingle() (<COMMA> <DOLLAR> VarName() <KEYWORD_IN> ExprSingle())*
}
// [6] http://www.w3.org/TR/xpath20/#doc-xpath-QuantifiedExpr
void QuantifiedExpr() :
{
}
{
(<KEYWORD_SOME> { jjtThis.setExistential(true); } | <KEYWORD_EVERY> { jjtThis.setExistential(false); }) <DOLLAR> VarName() <KEYWORD_IN> ExprSingle() (<COMMA> <DOLLAR> VarName() <KEYWORD_IN> ExprSingle())* <KEYWORD_SATISFIES> ExprSingle()
}
// [7] http://www.w3.org/TR/xpath20/#doc-xpath-IfExpr
void IfExpr() :
{
}
{
<KEYWORD_IF> <OPEN_PAREN> Expr() <CLOSE_PAREN> <KEYWORD_THEN> ExprSingle() <KEYWORD_ELSE> ExprSingle()
}
// [8] http://www.w3.org/TR/xpath20/#doc-xpath-OrExpr
void OrExpr() #OrExpr(>1) :
{
}
{
AndExpr() ( <KEYWORD_OR> AndExpr() )*
}
// [9] http://www.w3.org/TR/xpath20/#doc-xpath-AndExpr
void AndExpr() #AndExpr(>1) :
{
}
{
ComparisonExpr() ( <KEYWORD_AND> ComparisonExpr() )*
}
// [10] http://www.w3.org/TR/xpath20/#doc-xpath-ComparisonExpr
void ComparisonExpr() #ComparisonExpr(>1) :
{
}
{
RangeExpr() ( (ValueComp(jjtThis) | GeneralComp(jjtThis) | NodeComp(jjtThis)) RangeExpr() )?
}
// [11] http://www.w3.org/TR/xpath20/#doc-xpath-RangeExpr
void RangeExpr() #RangeExpr(>1):
{
}
{
AdditiveExpr() ( <KEYWORD_TO> AdditiveExpr() )?
}
// [12] http://www.w3.org/TR/xpath20/#doc-xpath-AdditiveExpr
void AdditiveExpr() #AdditiveExpr(>1) :
{
}
{
MultiplicativeExpr()
(
(
<PLUS> { jjtThis.addOperator(OperatorEnum.ADDITION); }
|
<MINUS> { jjtThis.addOperator(OperatorEnum.SUBTRACTION); }
)
MultiplicativeExpr()
)*
}
// [13] http://www.w3.org/TR/xpath20/#doc-xpath-MultiplicativeExpr
void MultiplicativeExpr() #MultiplicativeExpr(>1) :
{
}
{
UnionExpr()
(
(
<STAR> { jjtThis.addOperator(OperatorEnum.MULTIPLICATION); }
|
<KEYWORD_DIV> { jjtThis.addOperator(OperatorEnum.DIVISION); }
|
<KEYWORD_IDIV> { jjtThis.addOperator(OperatorEnum.INTEGER_DIVISION); }
|
<KEYWORD_MOD> { jjtThis.addOperator(OperatorEnum.MODULUS); }
)
UnionExpr()
)*
}
// [14] http://www.w3.org/TR/xpath20/#doc-xpath-UnionExpr
void UnionExpr() #UnionExpr(>1) :
{
}
{
IntersectExceptExpr()
(
(
<KEYWORD_UNION> { jjtThis.addOperator(OperatorEnum.SEQUENCE_UNION); }
|
<PIPE> { jjtThis.addOperator(OperatorEnum.SEQUENCE_UNION); }
)
IntersectExceptExpr()
)*
}
// [15] http://www.w3.org/TR/xpath20/#doc-xpath-IntersectExceptExpr
void IntersectExceptExpr() #IntersectExceptExpr(>1) :
{
}
{
InstanceofExpr()
(
(
<KEYWORD_INTERSECT> { jjtThis.addOperator(OperatorEnum.SEQUENCE_INTERSECT); }
|
<KEYWORD_EXCEPT> { jjtThis.addOperator(OperatorEnum.SEQUENCE_EXCEPT); }
)
InstanceofExpr()
)*
}
// [16] http://www.w3.org/TR/xpath20/#doc-xpath-InstanceofExpr
void InstanceofExpr() #InstanceofExpr(>1) :
{
}
{
TreatExpr() ( <KEYWORD_INSTANCE> <KEYWORD_OF> SequenceType() )?
}
// [17] http://www.w3.org/TR/xpath20/#doc-xpath-TreatExpr
void TreatExpr() #TreatExpr(>1) :
{
}
{
CastableExpr() ( <KEYWORD_TREAT> <KEYWORD_AS> SequenceType() )?
}
// [18] http://www.w3.org/TR/xpath20/#doc-xpath-CastableExpr
void CastableExpr() #CastableExpr(>1) :
{
}
{
CastExpr() ( <KEYWORD_CASTABLE> <KEYWORD_AS> SingleType() )?
}
// [19] http://www.w3.org/TR/xpath20/#doc-xpath-CastExpr
void CastExpr() #CastExpr(>1) :
{
}
{
UnaryExpr() ( <KEYWORD_CAST> <KEYWORD_AS> SingleType() )?
}
// [20] http://www.w3.org/TR/xpath20/#doc-xpath-UnaryExpr
void UnaryExpr() #UnaryExpr(keepUnaryExpr):
{
boolean keepUnaryExpr = false;
}
{
(
<MINUS> { keepUnaryExpr = true; jjtThis.addOperator(OperatorEnum.UNARY_MINUS); }
|
<PLUS> { keepUnaryExpr = true; jjtThis.addOperator(OperatorEnum.UNARY_PLUS); }
)*
ValueExpr()
}
// [21] http://www.w3.org/TR/xpath20/#doc-xpath-ValueExpr
void ValueExpr() #void :
{
}
{
PathExpr()
}
// [22] http://www.w3.org/TR/xpath20/#doc-xpath-GeneralComp
void GeneralComp(ASTComparisonExpr parent) #void :
{
}
{
<EQUAL> { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_EQUAL); }
|
<BANG_EQUAL> { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_NOT_EQUAL); }
|
<LESSER_THAN> { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_LESSER_THAN); }
|
<LESSER_THAN_EQUAL> { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_LESSER_THAN_OR_EQUAL); }
|
<GREATER_THAN> { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_GREATER_THAN); }
|
<GREATER_THAN_EQUAL> { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_GREATER_THAN_OR_EQUAL); }
}
// [23] http://www.w3.org/TR/xpath20/#doc-xpath-ValueComp
void ValueComp(ASTComparisonExpr parent) #void :
{
}
{
<KEYWORD_EQ> { parent.addOperator(OperatorEnum.VALUE_COMPARISION_EQUAL); }
|
<KEYWORD_NE> { parent.addOperator(OperatorEnum.VALUE_COMPARISION_NOT_EQUAL); }
|
<KEYWORD_LT> { parent.addOperator(OperatorEnum.VALUE_COMPARISION_LESSER_THAN); }
|
<KEYWORD_LE> { parent.addOperator(OperatorEnum.VALUE_COMPARISION_LESSER_THAN_OR_EQUAL); }
|
<KEYWORD_GT> { parent.addOperator(OperatorEnum.VALUE_COMPARISION_GREATER_THAN); }
|
<KEYWORD_GE> { parent.addOperator(OperatorEnum.VALUE_COMPARISION_GREATER_THAN_OR_EQUAL); }
}
// [24] http://www.w3.org/TR/xpath20/#doc-xpath-NodeComp
void NodeComp(ASTComparisonExpr parent) #void :
{
}
{
<KEYWORD_IS> { parent.addOperator(OperatorEnum.NODE_COMPARISION_IS); }
|
<PRECEEDS_OPERATOR> { parent.addOperator(OperatorEnum.NODE_COMPARISION_PRECEEDS); }
|
<FOLLOWS_OPERATOR> { parent.addOperator(OperatorEnum.NODE_COMPARISION_FOLLOWS); }
}
// [25] http://www.w3.org/TR/xpath20/#doc-xpath-PathExpr
void PathExpr() #PathExpr(>1) :
{
}
{
(<SLASH> #Slash(true) (LOOKAHEAD(2) RelativePathExpr())?)
|
(<SLASH_SLASH> #SlashSlash(true) RelativePathExpr())
|
RelativePathExpr()
// TODO
/* xgs: leading-lone-slash */
}
// [26] http://www.w3.org/TR/xpath20/#doc-xpath-RelativePathExpr
void RelativePathExpr() #void :
{
}
{
StepExpr()
(
(
<SLASH>
|
<SLASH_SLASH> #SlashSlash(true)
)
StepExpr()
)*
}
// [27] http://www.w3.org/TR/xpath20/#doc-xpath-StepExpr
void StepExpr() :
{
}
{
LOOKAHEAD(2) FilterExpr() | AxisStep()
}
// [28] http://www.w3.org/TR/xpath20/#doc-xpath-AxisStep
void AxisStep() #void :
{
}
{
(ReverseStep() | ForwardStep()) PredicateList()
}
// [29] http://www.w3.org/TR/xpath20/#doc-xpath-ForwardStep
void ForwardStep() #void :
{
}
{
LOOKAHEAD(2) (ForwardAxis() NodeTest()) | AbbrevForwardStep()
}
// [30] http://www.w3.org/TR/xpath20/#doc-xpath-ForwardAxis
void ForwardAxis() :
{
}
{
(<KEYWORD_CHILD> { jjtThis.addAxis(AxisEnum.CHILD); } <COLON_COLON>)
|
(<KEYWORD_DESCENDANT> { jjtThis.addAxis(AxisEnum.DESCENDANT); } <COLON_COLON>)
|
(<KEYWORD_ATTRIBUTE> { jjtThis.addAxis(AxisEnum.ATTRIBUTE); } <COLON_COLON>)
|
(<KEYWORD_SELF> { jjtThis.addAxis(AxisEnum.SELF); } <COLON_COLON>)
|
(<KEYWORD_DESCENDANT_OR_SELF> { jjtThis.addAxis(AxisEnum.DESCENDANT_OR_SELF); } <COLON_COLON>)
|
(<KEYWORD_FOLLOWING_SIBLING> { jjtThis.addAxis(AxisEnum.FOLLOWING_SIBLING); } <COLON_COLON>)
|
(<KEYWORD_FOLLOWING> { jjtThis.addAxis(AxisEnum.FOLLOWING); } <COLON_COLON>)
|
(<KEYWORD_NAMESPACE> { jjtThis.addAxis(AxisEnum.NAMESPACE); } <COLON_COLON>)
}
// [31] http://www.w3.org/TR/xpath20/#doc-xpath-AbbrevForwardStep
void AbbrevForwardStep() :
{
}
{
(<AT> { jjtThis.addAxis(AxisEnum.ATTRIBUTE); } )? NodeTest()
}
// [32] http://www.w3.org/TR/xpath20/#doc-xpath-ReverseStep
void ReverseStep() #void :
{
}
{
(ReverseAxis() NodeTest())
|
AbbrevReverseStep()
}
// [33] http://www.w3.org/TR/xpath20/#doc-xpath-ReverseAxis
void ReverseAxis() :
{
}
{
(<KEYWORD_PARENT> { jjtThis.addAxis(AxisEnum.PARENT); } <COLON_COLON>)
|
(<KEYWORD_ANCESTOR> { jjtThis.addAxis(AxisEnum.ANCESTOR); } <COLON_COLON>)
|
(<KEYWORD_PRECEDING_SIBLING> { jjtThis.addAxis(AxisEnum.PRECEDING_SIBLING); } <COLON_COLON>)
|
(<KEYWORD_PRECEDING> { jjtThis.addAxis(AxisEnum.PRECEDING); } <COLON_COLON>)
|
(<KEYWORD_ANCESTOR_OR_SELF> { jjtThis.addAxis(AxisEnum.ANCESTOR_OR_SELF); } <COLON_COLON>)
}
// [34] http://www.w3.org/TR/xpath20/#doc-xpath-AbbrevReverseStep
void AbbrevReverseStep() :
{
}
{
<DOT_DOT>
}
// [35] http://www.w3.org/TR/xpath20/#doc-xpath-NodeTest
void NodeTest() :
{
}
{
KindTest()
|
NameTest()
}
// [36] http://www.w3.org/TR/xpath20/#doc-xpath-NameTest
void NameTest() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); }
|
Wildcard()
}
// [37] http://www.w3.org/TR/xpath20/#doc-xpath-Wildcard
void Wildcard() :
{
}
{
LOOKAHEAD(2) <STAR>
|
{ Token token; }
(token = <NCNAME> { jjtThis.setImage(token.image); jjtThis.setPrefix(true); } <COLON> <STAR>)
|
(<STAR> <COLON> token = <NCNAME> { jjtThis.setImage(token.image); jjtThis.setPrefix(false); })
// TODO
/* ws: explicit */
}
// [38] http://www.w3.org/TR/xpath20/#doc-xpath-FilterExpr
void FilterExpr() #void :
{
}
{
PrimaryExpr() PredicateList()
}
// [39] http://www.w3.org/TR/xpath20/#doc-xpath-PredicateList
void PredicateList() #PredicateList(>0) :
{
}
{
(Predicate())*
}
// [40] http://www.w3.org/TR/xpath20/#doc-xpath-Predicate
void Predicate() #Predicate(>0) :
{
}
{
<OPEN_BRACKET> Expr() <CLOSE_BRACKET>
}
// [41] http://www.w3.org/TR/xpath20/#doc-xpath-PrimaryExpr
void PrimaryExpr() #void :
{
}
{
Literal()
|
VarRef()
|
ParenthesizedExpr()
|
ContextItemExpr()
|
FunctionCall()
}
// [42] http://www.w3.org/TR/xpath20/#doc-xpath-Literal
void Literal() #void :
{
}
{
NumericLiteral()
|
StringLiteral()
}
// [43] http://www.w3.org/TR/xpath20/#doc-xpath-NumericLiteral
void NumericLiteral() #void :
{
}
{
IntegerLiteral()
|
DecimalLiteral()
|
DoubleLiteral()
}
// [44] http://www.w3.org/TR/xpath20/#doc-xpath-VarRef
void VarRef() :
{
}
{
<DOLLAR> VarName()
}
// [45] http://www.w3.org/TR/xpath20/#doc-xpath-VarName
void VarName() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); }
}
// [46] http://www.w3.org/TR/xpath20/#doc-xpath-ParenthesizedExpr
void ParenthesizedExpr() :
{
}
{
<OPEN_PAREN> (Expr())? <CLOSE_PAREN>
}
// [47] http://www.w3.org/TR/xpath20/#doc-xpath-ContextItemExpr
void ContextItemExpr() :
{
}
{
<DOT>
}
// [48] http://www.w3.org/TR/xpath20/#doc-xpath-FunctionCall
void FunctionCall() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); } <OPEN_PAREN> (ExprSingle() (<COMMA> ExprSingle())*)? <CLOSE_PAREN>
// TODO
/* xgs: reserved-function-names */
// TODO
/* gn: parens */
}
// [49] http://www.w3.org/TR/xpath20/#doc-xpath-SingleType
void SingleType() :
{
}
{
{ Token token; }
AtomicType() (token = <QUESTION_MARK> { jjtThis.setImage(token.image); })?
}
// [50] http://www.w3.org/TR/xpath20/#doc-xpath-SequenceType
void SequenceType() :
{
}
{
(<KEYWORD_EMPTY_SEQUENCE> <OPEN_PAREN> <CLOSE_PAREN>)
|
(ItemType() (LOOKAHEAD(2) OccurrenceIndicator())?)
}
// [51] http://www.w3.org/TR/xpath20/#doc-xpath-OccurrenceIndicator
void OccurrenceIndicator() :
{
}
{
{ Token token; }
token = <QUESTION_MARK> { jjtThis.setImage(token.image); }
|
token = <STAR> { jjtThis.setImage(token.image); }
|
token = <PLUS> { jjtThis.setImage(token.image); }
// TODO
/* xgs: occurrence-indicators */
}
// [52] http://www.w3.org/TR/xpath20/#doc-xpath-ItemType
void ItemType() :
{
}
{
KindTest()
|
(<KEYWORD_ITEM> <OPEN_PAREN> <CLOSE_PAREN>)
|
AtomicType()
}
// [53] http://www.w3.org/TR/xpath20/#doc-xpath-AtomicType
void AtomicType() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); }
}
// [54] http://www.w3.org/TR/xpath20/#doc-xpath-KindTest
void KindTest() #void :
{
}
{
DocumentTest()
|
ElementTest()
|
AttributeTest()
|
SchemaElementTest()
|
SchemaAttributeTest()
|
PITest()
|
CommentTest()
|
TextTest()
|
AnyKindTest()
}
// [55] http://www.w3.org/TR/xpath20/#doc-xpath-AnyKindTest
void AnyKindTest() :
{
}
{
<KEYWORD_NODE> <OPEN_PAREN> <CLOSE_PAREN>
}
// [56] http://www.w3.org/TR/xpath20/#doc-xpath-DocumentTest
void DocumentTest() :
{
}
{
<KEYWORD_DOCUMENT_NODE> <OPEN_PAREN> (ElementTest() | SchemaElementTest())? <CLOSE_PAREN>
}
// [57] http://www.w3.org/TR/xpath20/#doc-xpath-TextTest
void TextTest() :
{
}
{
<KEYWORD_TEXT> <OPEN_PAREN> <CLOSE_PAREN>
}
// [58] http://www.w3.org/TR/xpath20/#doc-xpath-CommentTest
void CommentTest() :
{
}
{
<KEYWORD_COMMENT> <OPEN_PAREN> <CLOSE_PAREN>
}
// [59] http://www.w3.org/TR/xpath20/#doc-xpath-PITest
void PITest() :
{
}
{
{ Token token; }
<KEYWORD_PROCESSING_INSTRUCTION> <OPEN_PAREN> (token = <NCNAME> { jjtThis.setImage(token.image); } | StringLiteral())? <CLOSE_PAREN>
}
// [60] http://www.w3.org/TR/xpath20/#doc-xpath-AttributeTest
void AttributeTest() :
{
}
{
<KEYWORD_ATTRIBUTE> <OPEN_PAREN> (AttribNameOrWildcard() (<COMMA> TypeName())?)? <CLOSE_PAREN>
}
// [61] http://www.w3.org/TR/xpath20/#doc-xpath-AttribNameOrWildcard
void AttribNameOrWildcard() :
{
}
{
AttributeName()
|
<STAR>
}
// [62] http://www.w3.org/TR/xpath20/#doc-xpath-SchemaAttributeTest
void SchemaAttributeTest() :
{
}
{
<KEYWORD_SCHEMA_ATTRIBUTE> <OPEN_PAREN> AttributeDeclaration() <CLOSE_PAREN>
}
// [63] http://www.w3.org/TR/xpath20/#doc-xpath-AttributeDeclaration
void AttributeDeclaration() :
{
}
{
AttributeName()
}
// [64] http://www.w3.org/TR/xpath20/#doc-xpath-ElementTest
void ElementTest() :
{
}
{
{ Token token; }
<KEYWORD_ELEMENT> <OPEN_PAREN> (ElementNameOrWildcard() (<COMMA> TypeName() (token = <QUESTION_MARK> { jjtThis.setImage(token.image); })?)?)? <CLOSE_PAREN>
}
// [65] http://www.w3.org/TR/xpath20/#doc-xpath-ElementNameOrWildcard
void ElementNameOrWildcard() :
{
}
{
ElementName()
|
<STAR>
}
// [66] http://www.w3.org/TR/xpath20/#doc-xpath-SchemaElementTest
void SchemaElementTest() :
{
}
{
<KEYWORD_SCHEMA_ELEMENT> <OPEN_PAREN> ElementDeclaration() <CLOSE_PAREN>
}
// [67] http://www.w3.org/TR/xpath20/#doc-xpath-ElementDeclaration
void ElementDeclaration() :
{
}
{
ElementName()
}
// [68] http://www.w3.org/TR/xpath20/#doc-xpath-AttributeName
void AttributeName() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); }
}
// [69] http://www.w3.org/TR/xpath20/#doc-xpath-ElementName
void ElementName() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); }
}
// [70] http://www.w3.org/TR/xpath20/#doc-xpath-TypeName
void TypeName() :
{
}
{
{ Token token; }
token = <QNAME> { jjtThis.setImage(token.image); }
}
// [71] http://www.w3.org/TR/xpath20/#doc-xpath-IntegerLiteral
void IntegerLiteral() :
{
}
{
{ Token token; }
token = <INTEGER_LITERAL> { jjtThis.setImage(token.image); }
}
// [72] http://www.w3.org/TR/xpath20/#doc-xpath-DecimalLiteral
void DecimalLiteral() :
{
}
{
{ Token token; }
token = <DECIMAL_LITERAL> { jjtThis.setImage(token.image); }
}
// [73] http://www.w3.org/TR/xpath20/#doc-xpath-DoubleLiteral
void DoubleLiteral() :
{
}
{
{ Token token; }
token = <DOUBLE_LITERAL> { jjtThis.setImage(token.image); }
}
// [74] http://www.w3.org/TR/xpath20/#doc-xpath-StringLiteral
void StringLiteral() :
{
}
{
{ Token token; }
token = <STRING_LITERAL> { jjtThis.setImage(token.image); }
}