forked from phoedos/pmd
eafe5af965
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
1570 lines
34 KiB
Plaintext
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); }
|
|
}
|