/** * 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. // 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. // TOKEN : { : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | : DEFAULT | " > : DEFAULT | =" > : DEFAULT | >" > : DEFAULT | : DEFAULT | | ~["\""])* "\"") | ("'" ( | ~["'"])* "'") > : 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). // TOKEN : { : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | : DELIMITING | // TODO Continue from here > : DELIMITING | ) | ( "." (["0"-"9"])*) > : DELIMITING | ) | ( ("." (["0"-"9"])*)?)) ["e","E"] (["+","-"])? > : DELIMITING | <#DIGITS : (["0"-"9"])+ > | ":" ) | > | ()* > | <#NCNAMECHAR : // Note: JavaCC cannot do - ":", duplicate here with ":" removed | | "." | "-" | "_" | | > | <#NCNAMESTARTCHAR : | "_" > | <#NAMECHAR : | | "." | "-" | "_" | ":" | | > | <#LETTER : | > | <#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. // SPECIAL_TOKEN: { ()* > : DEFAULT } // Handles start of comment, and puts us into the INSIDE_COMMENT lexical state SPECIAL_TOKEN: { { // Push the lexical state pushLexState(); } : INSIDE_COMMENT } SPECIAL_TOKEN: { > } // Handles end of comment, and restores us into the prior lexical state. SPECIAL_TOKEN: { { // 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() { // 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() ( 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() ExprSingle() } // [5] http://www.w3.org/TR/xpath20/#prod-xpath-SimpleForClause void SimpleForClause() #void : { } { VarName() ExprSingle() ( VarName() ExprSingle())* } // [6] http://www.w3.org/TR/xpath20/#doc-xpath-QuantifiedExpr void QuantifiedExpr() : { } { ( { jjtThis.setExistential(true); } | { jjtThis.setExistential(false); }) VarName() ExprSingle() ( VarName() ExprSingle())* ExprSingle() } // [7] http://www.w3.org/TR/xpath20/#doc-xpath-IfExpr void IfExpr() : { } { Expr() ExprSingle() ExprSingle() } // [8] http://www.w3.org/TR/xpath20/#doc-xpath-OrExpr void OrExpr() #OrExpr(>1) : { } { AndExpr() ( AndExpr() )* } // [9] http://www.w3.org/TR/xpath20/#doc-xpath-AndExpr void AndExpr() #AndExpr(>1) : { } { ComparisonExpr() ( 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() ( AdditiveExpr() )? } // [12] http://www.w3.org/TR/xpath20/#doc-xpath-AdditiveExpr void AdditiveExpr() #AdditiveExpr(>1) : { } { MultiplicativeExpr() ( ( { jjtThis.addOperator(OperatorEnum.ADDITION); } | { jjtThis.addOperator(OperatorEnum.SUBTRACTION); } ) MultiplicativeExpr() )* } // [13] http://www.w3.org/TR/xpath20/#doc-xpath-MultiplicativeExpr void MultiplicativeExpr() #MultiplicativeExpr(>1) : { } { UnionExpr() ( ( { jjtThis.addOperator(OperatorEnum.MULTIPLICATION); } | { jjtThis.addOperator(OperatorEnum.DIVISION); } | { jjtThis.addOperator(OperatorEnum.INTEGER_DIVISION); } | { jjtThis.addOperator(OperatorEnum.MODULUS); } ) UnionExpr() )* } // [14] http://www.w3.org/TR/xpath20/#doc-xpath-UnionExpr void UnionExpr() #UnionExpr(>1) : { } { IntersectExceptExpr() ( ( { jjtThis.addOperator(OperatorEnum.SEQUENCE_UNION); } | { jjtThis.addOperator(OperatorEnum.SEQUENCE_UNION); } ) IntersectExceptExpr() )* } // [15] http://www.w3.org/TR/xpath20/#doc-xpath-IntersectExceptExpr void IntersectExceptExpr() #IntersectExceptExpr(>1) : { } { InstanceofExpr() ( ( { jjtThis.addOperator(OperatorEnum.SEQUENCE_INTERSECT); } | { jjtThis.addOperator(OperatorEnum.SEQUENCE_EXCEPT); } ) InstanceofExpr() )* } // [16] http://www.w3.org/TR/xpath20/#doc-xpath-InstanceofExpr void InstanceofExpr() #InstanceofExpr(>1) : { } { TreatExpr() ( SequenceType() )? } // [17] http://www.w3.org/TR/xpath20/#doc-xpath-TreatExpr void TreatExpr() #TreatExpr(>1) : { } { CastableExpr() ( SequenceType() )? } // [18] http://www.w3.org/TR/xpath20/#doc-xpath-CastableExpr void CastableExpr() #CastableExpr(>1) : { } { CastExpr() ( SingleType() )? } // [19] http://www.w3.org/TR/xpath20/#doc-xpath-CastExpr void CastExpr() #CastExpr(>1) : { } { UnaryExpr() ( SingleType() )? } // [20] http://www.w3.org/TR/xpath20/#doc-xpath-UnaryExpr void UnaryExpr() #UnaryExpr(keepUnaryExpr): { boolean keepUnaryExpr = false; } { ( { keepUnaryExpr = true; jjtThis.addOperator(OperatorEnum.UNARY_MINUS); } | { 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 : { } { { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_EQUAL); } | { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_NOT_EQUAL); } | { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_LESSER_THAN); } | { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_LESSER_THAN_OR_EQUAL); } | { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_GREATER_THAN); } | { parent.addOperator(OperatorEnum.GENERAL_COMPARISION_GREATER_THAN_OR_EQUAL); } } // [23] http://www.w3.org/TR/xpath20/#doc-xpath-ValueComp void ValueComp(ASTComparisonExpr parent) #void : { } { { parent.addOperator(OperatorEnum.VALUE_COMPARISION_EQUAL); } | { parent.addOperator(OperatorEnum.VALUE_COMPARISION_NOT_EQUAL); } | { parent.addOperator(OperatorEnum.VALUE_COMPARISION_LESSER_THAN); } | { parent.addOperator(OperatorEnum.VALUE_COMPARISION_LESSER_THAN_OR_EQUAL); } | { parent.addOperator(OperatorEnum.VALUE_COMPARISION_GREATER_THAN); } | { parent.addOperator(OperatorEnum.VALUE_COMPARISION_GREATER_THAN_OR_EQUAL); } } // [24] http://www.w3.org/TR/xpath20/#doc-xpath-NodeComp void NodeComp(ASTComparisonExpr parent) #void : { } { { parent.addOperator(OperatorEnum.NODE_COMPARISION_IS); } | { parent.addOperator(OperatorEnum.NODE_COMPARISION_PRECEEDS); } | { parent.addOperator(OperatorEnum.NODE_COMPARISION_FOLLOWS); } } // [25] http://www.w3.org/TR/xpath20/#doc-xpath-PathExpr void PathExpr() #PathExpr(>1) : { } { ( #Slash(true) (LOOKAHEAD(2) RelativePathExpr())?) | ( #SlashSlash(true) RelativePathExpr()) | RelativePathExpr() // TODO /* xgs: leading-lone-slash */ } // [26] http://www.w3.org/TR/xpath20/#doc-xpath-RelativePathExpr void RelativePathExpr() #void : { } { StepExpr() ( ( | #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() : { } { ( { jjtThis.addAxis(AxisEnum.CHILD); } ) | ( { jjtThis.addAxis(AxisEnum.DESCENDANT); } ) | ( { jjtThis.addAxis(AxisEnum.ATTRIBUTE); } ) | ( { jjtThis.addAxis(AxisEnum.SELF); } ) | ( { jjtThis.addAxis(AxisEnum.DESCENDANT_OR_SELF); } ) | ( { jjtThis.addAxis(AxisEnum.FOLLOWING_SIBLING); } ) | ( { jjtThis.addAxis(AxisEnum.FOLLOWING); } ) | ( { jjtThis.addAxis(AxisEnum.NAMESPACE); } ) } // [31] http://www.w3.org/TR/xpath20/#doc-xpath-AbbrevForwardStep void AbbrevForwardStep() : { } { ( { 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() : { } { ( { jjtThis.addAxis(AxisEnum.PARENT); } ) | ( { jjtThis.addAxis(AxisEnum.ANCESTOR); } ) | ( { jjtThis.addAxis(AxisEnum.PRECEDING_SIBLING); } ) | ( { jjtThis.addAxis(AxisEnum.PRECEDING); } ) | ( { jjtThis.addAxis(AxisEnum.ANCESTOR_OR_SELF); } ) } // [34] http://www.w3.org/TR/xpath20/#doc-xpath-AbbrevReverseStep void AbbrevReverseStep() : { } { } // [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 = { jjtThis.setImage(token.image); } | Wildcard() } // [37] http://www.w3.org/TR/xpath20/#doc-xpath-Wildcard void Wildcard() : { } { LOOKAHEAD(2) | { Token token; } (token = { jjtThis.setImage(token.image); jjtThis.setPrefix(true); } ) | ( token = { 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) : { } { Expr() } // [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() : { } { VarName() } // [45] http://www.w3.org/TR/xpath20/#doc-xpath-VarName void VarName() : { } { { Token token; } token = { jjtThis.setImage(token.image); } } // [46] http://www.w3.org/TR/xpath20/#doc-xpath-ParenthesizedExpr void ParenthesizedExpr() : { } { (Expr())? } // [47] http://www.w3.org/TR/xpath20/#doc-xpath-ContextItemExpr void ContextItemExpr() : { } { } // [48] http://www.w3.org/TR/xpath20/#doc-xpath-FunctionCall void FunctionCall() : { } { { Token token; } token = { jjtThis.setImage(token.image); } (ExprSingle() ( ExprSingle())*)? // TODO /* xgs: reserved-function-names */ // TODO /* gn: parens */ } // [49] http://www.w3.org/TR/xpath20/#doc-xpath-SingleType void SingleType() : { } { { Token token; } AtomicType() (token = { jjtThis.setImage(token.image); })? } // [50] http://www.w3.org/TR/xpath20/#doc-xpath-SequenceType void SequenceType() : { } { ( ) | (ItemType() (LOOKAHEAD(2) OccurrenceIndicator())?) } // [51] http://www.w3.org/TR/xpath20/#doc-xpath-OccurrenceIndicator void OccurrenceIndicator() : { } { { Token token; } token = { jjtThis.setImage(token.image); } | token = { jjtThis.setImage(token.image); } | token = { jjtThis.setImage(token.image); } // TODO /* xgs: occurrence-indicators */ } // [52] http://www.w3.org/TR/xpath20/#doc-xpath-ItemType void ItemType() : { } { KindTest() | ( ) | AtomicType() } // [53] http://www.w3.org/TR/xpath20/#doc-xpath-AtomicType void AtomicType() : { } { { Token token; } token = { 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() : { } { } // [56] http://www.w3.org/TR/xpath20/#doc-xpath-DocumentTest void DocumentTest() : { } { (ElementTest() | SchemaElementTest())? } // [57] http://www.w3.org/TR/xpath20/#doc-xpath-TextTest void TextTest() : { } { } // [58] http://www.w3.org/TR/xpath20/#doc-xpath-CommentTest void CommentTest() : { } { } // [59] http://www.w3.org/TR/xpath20/#doc-xpath-PITest void PITest() : { } { { Token token; } (token = { jjtThis.setImage(token.image); } | StringLiteral())? } // [60] http://www.w3.org/TR/xpath20/#doc-xpath-AttributeTest void AttributeTest() : { } { (AttribNameOrWildcard() ( TypeName())?)? } // [61] http://www.w3.org/TR/xpath20/#doc-xpath-AttribNameOrWildcard void AttribNameOrWildcard() : { } { AttributeName() | } // [62] http://www.w3.org/TR/xpath20/#doc-xpath-SchemaAttributeTest void SchemaAttributeTest() : { } { AttributeDeclaration() } // [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; } (ElementNameOrWildcard() ( TypeName() (token = { jjtThis.setImage(token.image); })?)?)? } // [65] http://www.w3.org/TR/xpath20/#doc-xpath-ElementNameOrWildcard void ElementNameOrWildcard() : { } { ElementName() | } // [66] http://www.w3.org/TR/xpath20/#doc-xpath-SchemaElementTest void SchemaElementTest() : { } { ElementDeclaration() } // [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 = { jjtThis.setImage(token.image); } } // [69] http://www.w3.org/TR/xpath20/#doc-xpath-ElementName void ElementName() : { } { { Token token; } token = { jjtThis.setImage(token.image); } } // [70] http://www.w3.org/TR/xpath20/#doc-xpath-TypeName void TypeName() : { } { { Token token; } token = { jjtThis.setImage(token.image); } } // [71] http://www.w3.org/TR/xpath20/#doc-xpath-IntegerLiteral void IntegerLiteral() : { } { { Token token; } token = { jjtThis.setImage(token.image); } } // [72] http://www.w3.org/TR/xpath20/#doc-xpath-DecimalLiteral void DecimalLiteral() : { } { { Token token; } token = { jjtThis.setImage(token.image); } } // [73] http://www.w3.org/TR/xpath20/#doc-xpath-DoubleLiteral void DoubleLiteral() : { } { { Token token; } token = { jjtThis.setImage(token.image); } } // [74] http://www.w3.org/TR/xpath20/#doc-xpath-StringLiteral void StringLiteral() : { } { { Token token; } token = { jjtThis.setImage(token.image); } }