diff --git a/pmd-jerry/etc/grammar/XPath2.jjt b/pmd-jerry/etc/grammar/XPath2.jjt index ae08fa487f..0f5452afcb 100644 --- a/pmd-jerry/etc/grammar/XPath2.jjt +++ b/pmd-jerry/etc/grammar/XPath2.jjt @@ -13,6 +13,10 @@ options 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) @@ -298,7 +302,7 @@ TOKEN : | <#NCNAMECHAR : // Note: JavaCC cannot do - ":", duplicate here with ":" removed - | | "." | "-" | "_" | ":" | | + | | "." | "-" | "_" | | > | <#NCNAMESTARTCHAR : @@ -1050,22 +1054,21 @@ void ForwardAxis() : { } { -// TODO Why is this not matching?!? - ("child" "::") + ("child" { jjtThis.addAxis(AxisEnum.CHILD); } "::") | - ("descendant" "::") + ("descendant" { jjtThis.addAxis(AxisEnum.DESCENDANT); } "::") | - ("attribute" "::") + ("attribute" { jjtThis.addAxis(AxisEnum.ATTRIBUTE); } "::") | - ("self" "::") + ("self" { jjtThis.addAxis(AxisEnum.SELF); } "::") | - ("descendant-or-self" "::") + ("descendant-or-self" { jjtThis.addAxis(AxisEnum.DESCENDANT_OR_SELF); } "::") | - ("following-sibling" "::") + ("following-sibling" { jjtThis.addAxis(AxisEnum.FOLLOWING_SIBLING); } "::") | - ("following" "::") + ("following" { jjtThis.addAxis(AxisEnum.FOLLOWING); } "::") | - ("namespace" "::") + ("namespace" { jjtThis.addAxis(AxisEnum.NAMESPACE); } "::") } // [31] http://www.w3.org/TR/xpath20/#doc-xpath-AbbrevForwardStep @@ -1091,15 +1094,15 @@ void ReverseAxis() : { } { - ("parent" "::") + ("parent" { jjtThis.addAxis(AxisEnum.PARENT); } "::") | - ("ancestor" "::") + ("ancestor" { jjtThis.addAxis(AxisEnum.ANCESTOR); } "::") | - ("preceding-sibling" "::") + ("preceding-sibling" { jjtThis.addAxis(AxisEnum.PRECEDING_SIBLING); } "::") | - ("preceding" "::") + ("preceding" { jjtThis.addAxis(AxisEnum.PRECEDING); } "::") | - ("ancestor-or-self" "::") + ("ancestor-or-self" { jjtThis.addAxis(AxisEnum.ANCESTOR_OR_SELF); } "::") } // [34] http://www.w3.org/TR/xpath20/#doc-xpath-AbbrevReverseStep @@ -1278,11 +1281,12 @@ void OccurrenceIndicator() : { } { - "?" + { Token token; } + token = "?" { jjtThis.setImage(token.image); } | - "*" + token = "*" { jjtThis.setImage(token.image); } | - "+" + token = "+" { jjtThis.setImage(token.image); } // TODO /* xgs: occurrence-indicators */ } @@ -1369,7 +1373,8 @@ void PITest() : { } { - "processing-instruction" "(" ( | StringLiteral())? ")" + { Token token; } + "processing-instruction" "(" (token = { jjtThis.setImage(token.image); } | StringLiteral())? ")" } // [60] http://www.w3.org/TR/xpath20/#doc-xpath-AttributeTest @@ -1411,7 +1416,8 @@ void ElementTest() : { } { - "element" "(" (ElementNameOrWildcard() ("," TypeName() ("?")?)?)? ")" + { Token token; } + "element" "(" (ElementNameOrWildcard() ("," TypeName() (token = "?" { jjtThis.setImage(token.image); })?)?)? ")" } // [65] http://www.w3.org/TR/xpath20/#doc-xpath-ElementNameOrWildcard diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTElementTest.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTElementTest.java index 2d6f966eca..7e5f12426d 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTElementTest.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTElementTest.java @@ -2,7 +2,9 @@ package net.sourceforge.pmd.jerry.ast.xpath; -public class ASTElementTest extends SimpleNode { +import net.sourceforge.pmd.jerry.ast.xpath.custom.ImageNode; + +public class ASTElementTest extends ImageNode { public ASTElementTest(int id) { super(id); } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTForwardAxis.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTForwardAxis.java index 9ba59f0da5..37a5f910c0 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTForwardAxis.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTForwardAxis.java @@ -2,7 +2,9 @@ package net.sourceforge.pmd.jerry.ast.xpath; -public class ASTForwardAxis extends SimpleNode { +import net.sourceforge.pmd.jerry.ast.xpath.custom.StepNode; + +public class ASTForwardAxis extends StepNode { public ASTForwardAxis(int id) { super(id); } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTOccurrenceIndicator.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTOccurrenceIndicator.java index b636423a42..1781aaf601 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTOccurrenceIndicator.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTOccurrenceIndicator.java @@ -2,7 +2,9 @@ package net.sourceforge.pmd.jerry.ast.xpath; -public class ASTOccurrenceIndicator extends SimpleNode { +import net.sourceforge.pmd.jerry.ast.xpath.custom.ImageNode; + +public class ASTOccurrenceIndicator extends ImageNode { public ASTOccurrenceIndicator(int id) { super(id); } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTPITest.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTPITest.java index 7e279e8ff3..b94a07e334 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTPITest.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTPITest.java @@ -2,7 +2,9 @@ package net.sourceforge.pmd.jerry.ast.xpath; -public class ASTPITest extends SimpleNode { +import net.sourceforge.pmd.jerry.ast.xpath.custom.ImageNode; + +public class ASTPITest extends ImageNode { public ASTPITest(int id) { super(id); } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTReverseAxis.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTReverseAxis.java index 4584e78355..d96e6a7ea2 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTReverseAxis.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/ASTReverseAxis.java @@ -2,7 +2,9 @@ package net.sourceforge.pmd.jerry.ast.xpath; -public class ASTReverseAxis extends SimpleNode { +import net.sourceforge.pmd.jerry.ast.xpath.custom.StepNode; + +public class ASTReverseAxis extends StepNode { public ASTReverseAxis(int id) { super(id); } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2Parser.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2Parser.java index 0591d36c82..85250613ea 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2Parser.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2Parser.java @@ -1515,34 +1515,42 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, switch (jj_nt.kind) { case KEYWORD_CHILD: jj_consume_token(KEYWORD_CHILD); + jjtn000.addAxis(AxisEnum.CHILD); jj_consume_token(COLON_COLON); break; case KEYWORD_DESCENDANT: jj_consume_token(KEYWORD_DESCENDANT); + jjtn000.addAxis(AxisEnum.DESCENDANT); jj_consume_token(COLON_COLON); break; case KEYWORD_ATTRIBUTE: jj_consume_token(KEYWORD_ATTRIBUTE); + jjtn000.addAxis(AxisEnum.ATTRIBUTE); jj_consume_token(COLON_COLON); break; case KEYWORD_SELF: jj_consume_token(KEYWORD_SELF); + jjtn000.addAxis(AxisEnum.SELF); jj_consume_token(COLON_COLON); break; case KEYWORD_DESCENDANT_OR_SELF: jj_consume_token(KEYWORD_DESCENDANT_OR_SELF); + jjtn000.addAxis(AxisEnum.DESCENDANT_OR_SELF); jj_consume_token(COLON_COLON); break; case KEYWORD_FOLLOWING_SIBLING: jj_consume_token(KEYWORD_FOLLOWING_SIBLING); + jjtn000.addAxis(AxisEnum.FOLLOWING_SIBLING); jj_consume_token(COLON_COLON); break; case KEYWORD_FOLLOWING: jj_consume_token(KEYWORD_FOLLOWING); + jjtn000.addAxis(AxisEnum.FOLLOWING); jj_consume_token(COLON_COLON); break; case KEYWORD_NAMESPACE: jj_consume_token(KEYWORD_NAMESPACE); + jjtn000.addAxis(AxisEnum.NAMESPACE); jj_consume_token(COLON_COLON); break; default: @@ -1650,22 +1658,27 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, switch (jj_nt.kind) { case KEYWORD_PARENT: jj_consume_token(KEYWORD_PARENT); + jjtn000.addAxis(AxisEnum.PARENT); jj_consume_token(COLON_COLON); break; case KEYWORD_ANCESTOR: jj_consume_token(KEYWORD_ANCESTOR); + jjtn000.addAxis(AxisEnum.ANCESTOR); jj_consume_token(COLON_COLON); break; case KEYWORD_PRECEDING_SIBLIING: jj_consume_token(KEYWORD_PRECEDING_SIBLIING); + jjtn000.addAxis(AxisEnum.PRECEDING_SIBLING); jj_consume_token(COLON_COLON); break; case KEYWORD_PRECEDING: jj_consume_token(KEYWORD_PRECEDING); + jjtn000.addAxis(AxisEnum.PRECEDING); jj_consume_token(COLON_COLON); break; case KEYWORD_ANCESTOR_OR_SELF: jj_consume_token(KEYWORD_ANCESTOR_OR_SELF); + jjtn000.addAxis(AxisEnum.ANCESTOR_OR_SELF); jj_consume_token(COLON_COLON); break; default: @@ -2408,13 +2421,23 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, try { switch (jj_nt.kind) { case QUESTION_MARK: - jj_consume_token(QUESTION_MARK); + Token token; + token = jj_consume_token(QUESTION_MARK); + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtn000.setImage(token.image); break; case STAR: - jj_consume_token(STAR); + token = jj_consume_token(STAR); + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtn000.setImage(token.image); break; case PLUS: - jj_consume_token(PLUS); + token = jj_consume_token(PLUS); + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtn000.setImage(token.image); break; default: jj_la1[49] = jj_gen; @@ -2422,9 +2445,9 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, throw new ParseException(); } } finally { - if (jjtc000) { - jjtree.closeNodeScope(jjtn000, true); - } + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } } } @@ -2670,6 +2693,7 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, boolean jjtc000 = true; jjtree.openNodeScope(jjtn000); try { + Token token; jj_consume_token(KEYWORD_PROCESSING_INSTRUCTION); jj_consume_token(OPEN_PAREN); switch (jj_nt.kind) { @@ -2677,7 +2701,8 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, case NCNAME: switch (jj_nt.kind) { case NCNAME: - jj_consume_token(NCNAME); + token = jj_consume_token(NCNAME); + jjtn000.setImage(token.image); break; case STRING_LITERAL: StringLiteral(); @@ -2871,6 +2896,7 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, boolean jjtc000 = true; jjtree.openNodeScope(jjtn000); try { + Token token; jj_consume_token(KEYWORD_ELEMENT); jj_consume_token(OPEN_PAREN); switch (jj_nt.kind) { @@ -2883,7 +2909,8 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, TypeName(); switch (jj_nt.kind) { case QUESTION_MARK: - jj_consume_token(QUESTION_MARK); + token = jj_consume_token(QUESTION_MARK); + jjtn000.setImage(token.image); break; default: jj_la1[59] = jj_gen; @@ -3190,18 +3217,18 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, finally { jj_save(4, xla); } } + final private boolean jj_3R_99() { + if (jj_3R_111()) return true; + return false; + } + final private boolean jj_3R_98() { if (jj_3R_110()) return true; return false; } - final private boolean jj_3R_130() { - if (jj_scan_token(PLUS)) return true; - return false; - } - - final private boolean jj_3R_104() { - if (jj_3R_115()) return true; + final private boolean jj_3R_131() { + if (jj_3R_134()) return true; return false; } @@ -3210,50 +3237,9 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_129() { - if (jj_scan_token(MINUS)) return true; - return false; - } - - final private boolean jj_3R_127() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_129()) { - jj_scanpos = xsp; - if (jj_3R_130()) return true; - } - return false; - } - - final private boolean jj_3R_96() { - if (jj_3R_108()) return true; - return false; - } - - final private boolean jj_3R_95() { - if (jj_3R_107()) return true; - return false; - } - - final private boolean jj_3R_128() { - if (jj_3R_131()) return true; - return false; - } - final private boolean jj_3R_94() { - if (jj_3R_106()) return true; - return false; - } - - final private boolean jj_3R_91() { Token xsp; xsp = jj_scanpos; - if (jj_3R_94()) { - jj_scanpos = xsp; - if (jj_3R_95()) { - jj_scanpos = xsp; - if (jj_3R_96()) { - jj_scanpos = xsp; if (jj_3R_97()) { jj_scanpos = xsp; if (jj_3R_98()) { @@ -3264,7 +3250,13 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, jj_scanpos = xsp; if (jj_3R_101()) { jj_scanpos = xsp; - if (jj_3R_102()) return true; + if (jj_3R_102()) { + jj_scanpos = xsp; + if (jj_3R_103()) { + jj_scanpos = xsp; + if (jj_3R_104()) { + jj_scanpos = xsp; + if (jj_3R_105()) return true; } } } @@ -3276,185 +3268,23 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_103() { + final private boolean jj_3R_106() { if (jj_scan_token(QNAME)) return true; return false; } - final private boolean jj_3R_92() { + final private boolean jj_3R_95() { Token xsp; xsp = jj_scanpos; - if (jj_3R_103()) { + if (jj_3R_106()) { jj_scanpos = xsp; - if (jj_3R_104()) return true; + if (jj_3R_107()) return true; } return false; } - final private boolean jj_3R_86() { - if (jj_3R_92()) return true; - return false; - } - - final private boolean jj_3R_85() { - if (jj_3R_91()) return true; - return false; - } - - final private boolean jj_3R_80() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_85()) { - jj_scanpos = xsp; - if (jj_3R_86()) return true; - } - return false; - } - - final private boolean jj_3R_56() { - if (jj_3R_63()) return true; - return false; - } - - final private boolean jj_3R_126() { - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3R_127()) { jj_scanpos = xsp; break; } - } - if (jj_3R_128()) return true; - return false; - } - - final private boolean jj_3R_55() { - if (jj_scan_token(STRING_LITERAL)) return true; - return false; - } - - final private boolean jj_3R_125() { - if (jj_3R_126()) return true; - return false; - } - - final private boolean jj_3R_69() { - if (jj_scan_token(DOUBLE_LITERAL)) return true; - return false; - } - - final private boolean jj_3R_65() { - if (jj_scan_token(DOT_DOT)) return true; - return false; - } - - final private boolean jj_3R_78() { - if (jj_scan_token(KEYWORD_ANCESTOR_OR_SELF)) return true; - if (jj_scan_token(COLON_COLON)) return true; - return false; - } - - final private boolean jj_3R_77() { - if (jj_scan_token(KEYWORD_PRECEDING)) return true; - if (jj_scan_token(COLON_COLON)) return true; - return false; - } - - final private boolean jj_3R_76() { - if (jj_scan_token(KEYWORD_PRECEDING_SIBLIING)) return true; - if (jj_scan_token(COLON_COLON)) return true; - return false; - } - - final private boolean jj_3R_124() { - if (jj_3R_125()) return true; - return false; - } - - final private boolean jj_3R_75() { - if (jj_scan_token(KEYWORD_ANCESTOR)) return true; - if (jj_scan_token(COLON_COLON)) return true; - return false; - } - - final private boolean jj_3_5() { - if (jj_3R_17()) return true; - return false; - } - - final private boolean jj_3R_64() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_74()) { - jj_scanpos = xsp; - if (jj_3R_75()) { - jj_scanpos = xsp; - if (jj_3R_76()) { - jj_scanpos = xsp; - if (jj_3R_77()) { - jj_scanpos = xsp; - if (jj_3R_78()) return true; - } - } - } - } - return false; - } - - final private boolean jj_3R_74() { - if (jj_scan_token(KEYWORD_PARENT)) return true; - if (jj_scan_token(COLON_COLON)) return true; - return false; - } - - final private boolean jj_3R_68() { - if (jj_scan_token(DECIMAL_LITERAL)) return true; - return false; - } - - final private boolean jj_3R_17() { - Token xsp; - xsp = jj_scanpos; - if (jj_scan_token(10)) { - jj_scanpos = xsp; - if (jj_scan_token(21)) { - jj_scanpos = xsp; - if (jj_scan_token(22)) return true; - } - } - return false; - } - - final private boolean jj_3R_123() { - if (jj_3R_124()) return true; - return false; - } - - final private boolean jj_3R_58() { - if (jj_3R_65()) return true; - return false; - } - - final private boolean jj_3R_67() { - if (jj_scan_token(INTEGER_LITERAL)) return true; - return false; - } - - final private boolean jj_3R_52() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_57()) { - jj_scanpos = xsp; - if (jj_3R_58()) return true; - } - return false; - } - - final private boolean jj_3R_57() { - if (jj_3R_64()) return true; - return false; - } - - final private boolean jj_3R_122() { - if (jj_3R_123()) return true; + final private boolean jj_3R_89() { + if (jj_3R_95()) return true; return false; } @@ -3463,7 +3293,184 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } + final private boolean jj_3R_88() { + if (jj_3R_94()) return true; + return false; + } + + final private boolean jj_3R_83() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_88()) { + jj_scanpos = xsp; + if (jj_3R_89()) return true; + } + return false; + } + + final private boolean jj_3R_58() { + if (jj_scan_token(STRING_LITERAL)) return true; + return false; + } + + final private boolean jj_3R_129() { + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_130()) { jj_scanpos = xsp; break; } + } + if (jj_3R_131()) return true; + return false; + } + + final private boolean jj_3R_128() { + if (jj_3R_129()) return true; + return false; + } + + final private boolean jj_3R_72() { + if (jj_scan_token(DOUBLE_LITERAL)) return true; + return false; + } + + final private boolean jj_3R_81() { + if (jj_scan_token(KEYWORD_ANCESTOR_OR_SELF)) return true; + if (jj_scan_token(COLON_COLON)) return true; + return false; + } + + final private boolean jj_3R_68() { + if (jj_scan_token(DOT_DOT)) return true; + return false; + } + + final private boolean jj_3R_80() { + if (jj_scan_token(KEYWORD_PRECEDING)) return true; + if (jj_scan_token(COLON_COLON)) return true; + return false; + } + + final private boolean jj_3R_127() { + if (jj_3R_128()) return true; + return false; + } + final private boolean jj_3R_79() { + if (jj_scan_token(KEYWORD_PRECEDING_SIBLIING)) return true; + if (jj_scan_token(COLON_COLON)) return true; + return false; + } + + final private boolean jj_3R_71() { + if (jj_scan_token(DECIMAL_LITERAL)) return true; + return false; + } + + final private boolean jj_3R_78() { + if (jj_scan_token(KEYWORD_ANCESTOR)) return true; + if (jj_scan_token(COLON_COLON)) return true; + return false; + } + + final private boolean jj_3R_32() { + if (jj_scan_token(PLUS)) return true; + return false; + } + + final private boolean jj_3_5() { + if (jj_3R_17()) return true; + return false; + } + + final private boolean jj_3R_67() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_77()) { + jj_scanpos = xsp; + if (jj_3R_78()) { + jj_scanpos = xsp; + if (jj_3R_79()) { + jj_scanpos = xsp; + if (jj_3R_80()) { + jj_scanpos = xsp; + if (jj_3R_81()) return true; + } + } + } + } + return false; + } + + final private boolean jj_3R_77() { + if (jj_scan_token(KEYWORD_PARENT)) return true; + if (jj_scan_token(COLON_COLON)) return true; + return false; + } + + final private boolean jj_3R_31() { + if (jj_scan_token(STAR)) return true; + return false; + } + + final private boolean jj_3R_126() { + if (jj_3R_127()) return true; + return false; + } + + final private boolean jj_3R_70() { + if (jj_scan_token(INTEGER_LITERAL)) return true; + return false; + } + + final private boolean jj_3R_61() { + if (jj_3R_68()) return true; + return false; + } + + final private boolean jj_3R_55() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_60()) { + jj_scanpos = xsp; + if (jj_3R_61()) return true; + } + return false; + } + + final private boolean jj_3R_60() { + if (jj_3R_67()) return true; + return false; + } + + final private boolean jj_3R_125() { + if (jj_3R_126()) return true; + return false; + } + + final private boolean jj_3R_30() { + if (jj_scan_token(QUESTION_MARK)) return true; + return false; + } + + final private boolean jj_3R_17() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_30()) { + jj_scanpos = xsp; + if (jj_3R_31()) { + jj_scanpos = xsp; + if (jj_3R_32()) return true; + } + } + return false; + } + + final private boolean jj_3R_62() { + if (jj_3R_69()) return true; + return false; + } + + final private boolean jj_3R_82() { if (jj_scan_token(AT)) return true; return false; } @@ -3474,11 +3481,16 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_66() { + final private boolean jj_3R_69() { Token xsp; xsp = jj_scanpos; - if (jj_3R_79()) jj_scanpos = xsp; - if (jj_3R_80()) return true; + if (jj_3R_82()) jj_scanpos = xsp; + if (jj_3R_83()) return true; + return false; + } + + final private boolean jj_3R_124() { + if (jj_3R_125()) return true; return false; } @@ -3488,11 +3500,6 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_121() { - if (jj_3R_122()) return true; - return false; - } - final private boolean jj_3R_27() { if (jj_scan_token(KEYWORD_FOLLOWING_SIBLING)) return true; if (jj_scan_token(COLON_COLON)) return true; @@ -3523,12 +3530,6 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_22() { - if (jj_scan_token(KEYWORD_CHILD)) return true; - if (jj_scan_token(COLON_COLON)) return true; - return false; - } - final private boolean jj_3R_16() { Token xsp; xsp = jj_scanpos; @@ -3557,40 +3558,46 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_44() { + final private boolean jj_3R_22() { + if (jj_scan_token(KEYWORD_CHILD)) return true; + if (jj_scan_token(COLON_COLON)) return true; + return false; + } + + final private boolean jj_3R_123() { + if (jj_3R_124()) return true; + return false; + } + + final private boolean jj_3R_33() { + if (jj_3R_42()) return true; + return false; + } + + final private boolean jj_3R_47() { if (jj_scan_token(QNAME)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_120() { - if (jj_3R_121()) return true; + final private boolean jj_3R_50() { + if (jj_3R_56()) return true; return false; } - final private boolean jj_3R_30() { - if (jj_3R_39()) return true; - return false; - } - - final private boolean jj_3R_47() { - if (jj_3R_53()) return true; - return false; - } - - final private boolean jj_3R_109() { + final private boolean jj_3R_112() { if (jj_scan_token(KEYWORD_SCHEMA_ELEMENT)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_43() { + final private boolean jj_3R_46() { if (jj_scan_token(DOT)) return true; return false; } - final private boolean jj_3R_51() { - if (jj_3R_56()) return true; + final private boolean jj_3R_54() { + if (jj_3R_59()) return true; return false; } @@ -3599,31 +3606,31 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_53() { + final private boolean jj_3R_56() { Token xsp; xsp = jj_scanpos; if (jj_3_3()) { jj_scanpos = xsp; - if (jj_3R_59()) return true; + if (jj_3R_62()) return true; } return false; } - final private boolean jj_3R_32() { + final private boolean jj_3R_35() { if (jj_scan_token(SLASH_SLASH)) return true; return false; } - final private boolean jj_3R_42() { + final private boolean jj_3R_45() { if (jj_scan_token(OPEN_PAREN)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_51()) jj_scanpos = xsp; + if (jj_3R_54()) jj_scanpos = xsp; if (jj_scan_token(CLOSE_PARAN)) return true; return false; } - final private boolean jj_3R_31() { + final private boolean jj_3R_34() { if (jj_scan_token(SLASH)) return true; return false; } @@ -3633,35 +3640,35 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_46() { - if (jj_3R_52()) return true; + final private boolean jj_3R_49() { + if (jj_3R_55()) return true; return false; } - final private boolean jj_3R_119() { - if (jj_3R_120()) return true; + final private boolean jj_3R_122() { + if (jj_3R_123()) return true; return false; } - final private boolean jj_3R_39() { + final private boolean jj_3R_42() { Token xsp; xsp = jj_scanpos; - if (jj_3R_46()) { + if (jj_3R_49()) { jj_scanpos = xsp; - if (jj_3R_47()) return true; + if (jj_3R_50()) return true; } if (jj_3R_21()) return true; return false; } - final private boolean jj_3R_50() { - if (jj_scan_token(QNAME)) return true; + final private boolean jj_3R_110() { + if (jj_scan_token(KEYWORD_ELEMENT)) return true; + if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_107() { - if (jj_scan_token(KEYWORD_ELEMENT)) return true; - if (jj_scan_token(OPEN_PAREN)) return true; + final private boolean jj_3R_53() { + if (jj_scan_token(QNAME)) return true; return false; } @@ -3675,73 +3682,73 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, xsp = jj_scanpos; if (jj_3_2()) { jj_scanpos = xsp; - if (jj_3R_30()) return true; + if (jj_3R_33()) return true; } return false; } - final private boolean jj_3R_41() { + final private boolean jj_3R_44() { if (jj_scan_token(DOLLAR)) return true; - if (jj_3R_50()) return true; + if (jj_3R_53()) return true; return false; } - final private boolean jj_3R_62() { - if (jj_3R_69()) return true; + final private boolean jj_3R_65() { + if (jj_3R_72()) return true; return false; } final private boolean jj_3R_19() { Token xsp; xsp = jj_scanpos; - if (jj_3R_31()) { + if (jj_3R_34()) { jj_scanpos = xsp; - if (jj_3R_32()) return true; + if (jj_3R_35()) return true; } return false; } - final private boolean jj_3R_61() { - if (jj_3R_68()) return true; + final private boolean jj_3R_64() { + if (jj_3R_71()) return true; return false; } - final private boolean jj_3R_116() { - if (jj_3R_119()) return true; + final private boolean jj_3R_119() { + if (jj_3R_122()) return true; return false; } - final private boolean jj_3R_54() { + final private boolean jj_3R_57() { Token xsp; xsp = jj_scanpos; - if (jj_3R_60()) { + if (jj_3R_63()) { jj_scanpos = xsp; - if (jj_3R_61()) { + if (jj_3R_64()) { jj_scanpos = xsp; - if (jj_3R_62()) return true; + if (jj_3R_65()) return true; } } return false; } - final private boolean jj_3R_60() { - if (jj_3R_67()) return true; + final private boolean jj_3R_63() { + if (jj_3R_70()) return true; return false; } - final private boolean jj_3R_89() { - if (jj_scan_token(KEYWORD_EVERY)) return true; - return false; - } - - final private boolean jj_3R_110() { + final private boolean jj_3R_113() { if (jj_scan_token(KEYWORD_SCHEMA_ATTRIBUTE)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_105() { - if (jj_3R_116()) return true; + final private boolean jj_3R_92() { + if (jj_scan_token(KEYWORD_EVERY)) return true; + return false; + } + + final private boolean jj_3R_108() { + if (jj_3R_119()) return true; return false; } @@ -3755,56 +3762,82 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_49() { - if (jj_3R_55()) return true; + final private boolean jj_3R_52() { + if (jj_3R_58()) return true; return false; } - final private boolean jj_3R_134() { + final private boolean jj_3R_137() { if (jj_3R_14()) return true; return false; } - final private boolean jj_3R_40() { + final private boolean jj_3R_43() { Token xsp; xsp = jj_scanpos; - if (jj_3R_48()) { + if (jj_3R_51()) { jj_scanpos = xsp; - if (jj_3R_49()) return true; + if (jj_3R_52()) return true; } return false; } - final private boolean jj_3R_48() { - if (jj_3R_54()) return true; + final private boolean jj_3R_51() { + if (jj_3R_57()) return true; return false; } - final private boolean jj_3R_133() { + final private boolean jj_3R_136() { if (jj_scan_token(SLASH_SLASH)) return true; return false; } - final private boolean jj_3R_132() { + final private boolean jj_3R_135() { if (jj_scan_token(SLASH)) return true; return false; } - final private boolean jj_3R_131() { + final private boolean jj_3R_134() { Token xsp; xsp = jj_scanpos; - if (jj_3R_132()) { + if (jj_3R_135()) { jj_scanpos = xsp; - if (jj_3R_133()) { + if (jj_3R_136()) { jj_scanpos = xsp; - if (jj_3R_134()) return true; + if (jj_3R_137()) return true; } } return false; } + final private boolean jj_3R_96() { + if (jj_3R_108()) return true; + return false; + } + + final private boolean jj_3R_40() { + if (jj_3R_47()) return true; + return false; + } + + final private boolean jj_3R_39() { + if (jj_3R_46()) return true; + return false; + } + + final private boolean jj_3R_111() { + if (jj_scan_token(KEYWORD_ATTRIBUTE)) return true; + if (jj_scan_token(OPEN_PAREN)) return true; + return false; + } + + final private boolean jj_3R_38() { + if (jj_3R_45()) return true; + return false; + } + final private boolean jj_3R_93() { - if (jj_3R_105()) return true; + if (jj_3R_96()) return true; return false; } @@ -3818,44 +3851,18 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_35() { - if (jj_3R_42()) return true; - return false; - } - - final private boolean jj_3R_108() { - if (jj_scan_token(KEYWORD_ATTRIBUTE)) return true; - if (jj_scan_token(OPEN_PAREN)) return true; - return false; - } - - final private boolean jj_3R_90() { - if (jj_3R_93()) return true; - return false; - } - - final private boolean jj_3R_34() { - if (jj_3R_41()) return true; - return false; - } - - final private boolean jj_3R_33() { - if (jj_3R_40()) return true; - return false; - } - final private boolean jj_3R_20() { Token xsp; xsp = jj_scanpos; - if (jj_3R_33()) { - jj_scanpos = xsp; - if (jj_3R_34()) { - jj_scanpos = xsp; - if (jj_3R_35()) { - jj_scanpos = xsp; if (jj_3R_36()) { jj_scanpos = xsp; - if (jj_3R_37()) return true; + if (jj_3R_37()) { + jj_scanpos = xsp; + if (jj_3R_38()) { + jj_scanpos = xsp; + if (jj_3R_39()) { + jj_scanpos = xsp; + if (jj_3R_40()) return true; } } } @@ -3863,56 +3870,56 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_111() { + final private boolean jj_3R_114() { if (jj_scan_token(KEYWORD_PROCESSING_INSTRUCTION)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_84() { - if (jj_3R_90()) return true; + final private boolean jj_3R_87() { + if (jj_3R_93()) return true; return false; } - final private boolean jj_3R_112() { + final private boolean jj_3R_115() { if (jj_scan_token(KEYWORD_COMMENT)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_83() { + final private boolean jj_3R_86() { if (jj_scan_token(KEYWORD_IF)) return true; return false; } - final private boolean jj_3R_45() { + final private boolean jj_3R_48() { if (jj_scan_token(OPEN_BRACKET)) return true; return false; } - final private boolean jj_3R_113() { + final private boolean jj_3R_116() { if (jj_scan_token(KEYWORD_TEXT)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_88() { + final private boolean jj_3R_91() { if (jj_scan_token(KEYWORD_SOME)) return true; return false; } - final private boolean jj_3R_82() { + final private boolean jj_3R_85() { Token xsp; xsp = jj_scanpos; - if (jj_3R_88()) { + if (jj_3R_91()) { jj_scanpos = xsp; - if (jj_3R_89()) return true; + if (jj_3R_92()) return true; } return false; } - final private boolean jj_3R_38() { - if (jj_3R_45()) return true; + final private boolean jj_3R_41() { + if (jj_3R_48()) return true; return false; } @@ -3920,18 +3927,18 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_38()) { jj_scanpos = xsp; break; } + if (jj_3R_41()) { jj_scanpos = xsp; break; } } return false; } - final private boolean jj_3R_106() { + final private boolean jj_3R_109() { if (jj_scan_token(KEYWORD_DOCUMENT_NODE)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_87() { + final private boolean jj_3R_90() { if (jj_scan_token(KEYWORD_FOR)) return true; return false; } @@ -3942,54 +3949,59 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_118() { + final private boolean jj_3R_121() { if (jj_scan_token(STAR)) return true; if (jj_scan_token(COLON)) return true; return false; } final private boolean jj_3R_117() { - if (jj_scan_token(NCNAME)) return true; - if (jj_scan_token(COLON)) return true; - return false; - } - - final private boolean jj_3R_114() { if (jj_scan_token(KEYWORD_NODE)) return true; if (jj_scan_token(OPEN_PAREN)) return true; return false; } - final private boolean jj_3R_102() { - if (jj_3R_114()) return true; + final private boolean jj_3R_105() { + if (jj_3R_117()) return true; return false; } - final private boolean jj_3R_81() { + final private boolean jj_3R_120() { + if (jj_scan_token(NCNAME)) return true; + if (jj_scan_token(COLON)) return true; + return false; + } + + final private boolean jj_3R_84() { + if (jj_3R_90()) return true; + return false; + } + + final private boolean jj_3R_76() { if (jj_3R_87()) return true; return false; } - final private boolean jj_3R_73() { - if (jj_3R_84()) return true; + final private boolean jj_3R_104() { + if (jj_3R_116()) return true; return false; } - final private boolean jj_3R_115() { + final private boolean jj_3R_118() { Token xsp; xsp = jj_scanpos; if (jj_3_4()) { jj_scanpos = xsp; - if (jj_3R_117()) { + if (jj_3R_120()) { jj_scanpos = xsp; - if (jj_3R_118()) return true; + if (jj_3R_121()) return true; } } return false; } - final private boolean jj_3R_101() { - if (jj_3R_113()) return true; + final private boolean jj_3R_75() { + if (jj_3R_86()) return true; return false; } @@ -3998,8 +4010,49 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_72() { - if (jj_3R_83()) return true; + final private boolean jj_3R_103() { + if (jj_3R_115()) return true; + return false; + } + + final private boolean jj_3R_74() { + if (jj_3R_85()) return true; + return false; + } + + final private boolean jj_3R_102() { + if (jj_3R_114()) return true; + return false; + } + + final private boolean jj_3R_66() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_73()) { + jj_scanpos = xsp; + if (jj_3R_74()) { + jj_scanpos = xsp; + if (jj_3R_75()) { + jj_scanpos = xsp; + if (jj_3R_76()) return true; + } + } + } + return false; + } + + final private boolean jj_3R_73() { + if (jj_3R_84()) return true; + return false; + } + + final private boolean jj_3R_101() { + if (jj_3R_113()) return true; + return false; + } + + final private boolean jj_3R_133() { + if (jj_scan_token(PLUS)) return true; return false; } @@ -4008,34 +4061,23 @@ public class XPath2Parser/*@bgen(jjtree)*/implements XPath2ParserTreeConstants, return false; } - final private boolean jj_3R_71() { - if (jj_3R_82()) return true; + final private boolean jj_3R_132() { + if (jj_scan_token(MINUS)) return true; return false; } - final private boolean jj_3R_99() { - if (jj_3R_111()) return true; - return false; - } - - final private boolean jj_3R_63() { + final private boolean jj_3R_130() { Token xsp; xsp = jj_scanpos; - if (jj_3R_70()) { + if (jj_3R_132()) { jj_scanpos = xsp; - if (jj_3R_71()) { - jj_scanpos = xsp; - if (jj_3R_72()) { - jj_scanpos = xsp; - if (jj_3R_73()) return true; - } - } + if (jj_3R_133()) return true; } return false; } - final private boolean jj_3R_70() { - if (jj_3R_81()) return true; + final private boolean jj_3R_107() { + if (jj_3R_118()) return true; return false; } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTokenManager.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTokenManager.java index ac2bcef09d..63534f721d 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTokenManager.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTokenManager.java @@ -1611,22 +1611,22 @@ private final int jjMoveNfa_0(int startState, int curPos) } break; case 36: - if ((0x7ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) { if (kind > 94) kind = 94; jjCheckNAdd(35); } - if ((0x7ff600000000000L & l) != 0L) + else if (curChar == 58) + jjstateSet[jjnewStateCnt++] = 32; + if ((0x3ff600000000000L & l) != 0L) { if (kind > 93) kind = 93; jjCheckNAdd(34); } - if ((0x7ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) jjCheckNAddTwoStates(30, 31); - if (curChar == 58) - jjstateSet[jjnewStateCnt++] = 32; break; case 0: if ((0x3ff000000000000L & l) != 0L) @@ -1768,7 +1768,7 @@ private final int jjMoveNfa_0(int startState, int curPos) jjCheckNAddTwoStates(28, 23); break; case 30: - if ((0x7ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) jjCheckNAddTwoStates(30, 31); break; case 31: @@ -1776,21 +1776,21 @@ private final int jjMoveNfa_0(int startState, int curPos) jjstateSet[jjnewStateCnt++] = 32; break; case 33: - if ((0x7ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) break; if (kind > 93) kind = 93; jjstateSet[jjnewStateCnt++] = 33; break; case 34: - if ((0x7ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) break; if (kind > 93) kind = 93; jjCheckNAdd(34); break; case 35: - if ((0x7ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) break; if (kind > 94) kind = 94; diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/AbstractPrintVisitor.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/AbstractPrintVisitor.java index 4ce2f1542b..2b75649540 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/AbstractPrintVisitor.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/AbstractPrintVisitor.java @@ -17,10 +17,18 @@ public abstract class AbstractPrintVisitor { return outputBuffer.toString(); } + protected void print(Object o) { + print(String.valueOf(o)); + } + protected void print(String s) { lineBuffer.append(s); } + protected void println(Object o) { + println(String.valueOf(o)); + } + protected void println(String s) { print(s); println(); @@ -64,7 +72,6 @@ public abstract class AbstractPrintVisitor { } protected void TODO(Node node) { - String nodeName = node.getClass().getName(); StringBuffer buf = new StringBuffer(100); buf.append("Visit for "); buf.append(node); diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/PrintXPath2ParserVisitor.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/PrintXPath2ParserVisitor.java index 8d4b63e709..8d3804fa72 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/PrintXPath2ParserVisitor.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/ast/xpath/visitor/PrintXPath2ParserVisitor.java @@ -1,5 +1,8 @@ package net.sourceforge.pmd.jerry.ast.xpath.visitor; +import java.io.Reader; +import java.io.StringReader; + import net.sourceforge.pmd.jerry.ast.xpath.ASTAbbrevForwardStep; import net.sourceforge.pmd.jerry.ast.xpath.ASTAbbrevReverseStep; import net.sourceforge.pmd.jerry.ast.xpath.ASTAdditiveExpr; @@ -75,6 +78,7 @@ import net.sourceforge.pmd.jerry.ast.xpath.ASTVarRef; import net.sourceforge.pmd.jerry.ast.xpath.ASTWildcard; import net.sourceforge.pmd.jerry.ast.xpath.ASTXPath; import net.sourceforge.pmd.jerry.ast.xpath.SimpleNode; +import net.sourceforge.pmd.jerry.ast.xpath.XPath2Parser; import net.sourceforge.pmd.jerry.ast.xpath.XPath2ParserVisitor; import net.sourceforge.pmd.jerry.ast.xpath.custom.OperatorNode; import net.sourceforge.pmd.jerry.xpath.AxisEnum; @@ -85,7 +89,22 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements private final PrintModeEnum printMode; public static enum PrintModeEnum { - ABBREVIATE(), UNABBREVIATE(), PRESERVE(); + ABBREVIATE(), UNABBREVIATE(); + } + + public static String abbreviate(String query) { + return visit(query, PrintModeEnum.ABBREVIATE); + } + public static String unabbreviate(String query) { + return visit(query, PrintModeEnum.UNABBREVIATE); + } + private static String visit(String query, PrintModeEnum printMode) { + Reader reader = new StringReader(query); + XPath2Parser parser = new XPath2Parser(reader); + ASTXPath xpath = parser.XPath(); + PrintXPath2ParserVisitor visitor = new PrintXPath2ParserVisitor(printMode); + xpath.jjtAccept(visitor, null); + return visitor.getOutput(); } public PrintXPath2ParserVisitor(PrintModeEnum printMode) { @@ -112,7 +131,7 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements continue; } print(" "); - print(node.getOperator((i - 1) / 2).toString()); + print(node.getOperator((i - 1) / 2)); print(" "); } node.jjtGetChild(i).jjtAccept(this, data); @@ -127,12 +146,9 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements print("@"); break; case UNABBREVIATE: - print(AxisEnum.ATTRIBUTE.toString()); + print(AxisEnum.ATTRIBUTE); print("::"); break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException("Unknown PrintModeEnum: " + printMode); @@ -142,12 +158,18 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements case ABBREVIATE: break; case UNABBREVIATE: - print(AxisEnum.CHILD.toString()); + AxisEnum axis = AxisEnum.CHILD; + if (node.jjtGetChild(0).jjtGetChild(0) instanceof ASTKindTest) { + Object testNode = node.jjtGetChild(0).jjtGetChild(0) + .jjtGetChild(0); + if (testNode instanceof ASTAttributeTest + || testNode instanceof ASTSchemaAttributeTest) { + axis = AxisEnum.ATTRIBUTE; + } + } + print(axis); print("::"); break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException("Unknown PrintModeEnum: " + printMode); @@ -163,12 +185,9 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements print(".."); break; case UNABBREVIATE: - print(AxisEnum.PARENT.toString()); + print(AxisEnum.PARENT); print("::node()"); break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException("Unknown PrintModeEnum: " + printMode); @@ -187,8 +206,7 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTAnyKindTest node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print("node()"); return data; } @@ -198,26 +216,29 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTAttribNameOrWildcard node, Object data) { - TODO(node); - node.childrenAccept(this, data); + if (node.jjtGetNumChildren() > 0) { + node.childrenAccept(this, data); + } else { + print("*"); + } return data; } public Object visit(ASTAttributeDeclaration node, Object data) { - TODO(node); + // Nothing to do node.childrenAccept(this, data); return data; } public Object visit(ASTAttributeName node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print(node.getImage()); return data; } public Object visit(ASTAttributeTest node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print("attribute("); + visitSeparator(node, data, ", "); + print(")"); return data; } @@ -238,8 +259,7 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTCommentTest node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print("comment()"); return data; } @@ -271,26 +291,38 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTElementDeclaration node, Object data) { - TODO(node); + // Nothing to do node.childrenAccept(this, data); return data; } public Object visit(ASTElementName node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print(node.getImage()); return data; } public Object visit(ASTElementNameOrWildcard node, Object data) { - TODO(node); - node.childrenAccept(this, data); + if (node.jjtGetNumChildren() > 0) { + node.childrenAccept(this, data); + } else { + print("*"); + } return data; } public Object visit(ASTElementTest node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print("element("); + if (node.jjtGetNumChildren() > 0) { + node.jjtGetChild(0).jjtAccept(this, data); + } + if (node.jjtGetNumChildren() > 1) { + print(", "); + node.jjtGetChild(1).jjtAccept(this, data); + if (node.getImage() != null) { + print("?"); + } + } + print(")"); return data; } @@ -319,14 +351,52 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTForwardAxis node, Object data) { - TODO(node); - node.childrenAccept(this, data); + AxisEnum axis = node.getAxis(0); + switch (printMode) { + case ABBREVIATE: + switch (axis) { + case CHILD: + break; + case ATTRIBUTE: + print("@"); + break; + default: + print(axis); + print("::"); + } + break; + case UNABBREVIATE: + print(axis); + print("::"); + break; + default: + throw new IllegalStateException("Unknown PrintModeEnum: " + + printMode); + } return data; } public Object visit(ASTForwardStep node, Object data) { - // Nothing to do - node.childrenAccept(this, data); + switch (printMode) { + case ABBREVIATE: + if (node.jjtGetNumChildren() == 2) { + if (((ASTForwardAxis) node.jjtGetChild(0)).getAxis(0) == AxisEnum.DESCENDANT_OR_SELF) { + if (node.jjtGetChild(1).jjtGetChild(0) instanceof ASTKindTest) { + if (node.jjtGetChild(1).jjtGetChild(0).jjtGetChild(0) instanceof ASTAnyKindTest) { + break; + } + } + } + } + node.childrenAccept(this, data); + break; + case UNABBREVIATE: + node.childrenAccept(this, data); + break; + default: + throw new IllegalStateException("Unknown PrintModeEnum: " + + printMode); + } return data; } @@ -344,9 +414,8 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTGeneralComp node, Object data) { - TODO(node); - node.childrenAccept(this, data); - return data; + // Nothing to do + throw new IllegalStateException("Should not be here!"); } public Object visit(ASTIfExpr node, Object data) { @@ -415,9 +484,8 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTNodeComp node, Object data) { - TODO(node); - node.childrenAccept(this, data); - return data; + // Nothing to do + throw new IllegalStateException("Should not be here!"); } public Object visit(ASTNodeTest node, Object data) { @@ -433,8 +501,7 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTOccurrenceIndicator node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print(node.getImage()); return data; } @@ -458,15 +525,12 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements break; case UNABBREVIATE: print("fn:root("); - print(AxisEnum.SELF.toString()); + print(AxisEnum.SELF); print("::node()) treat as document-node()"); if (node.jjtGetNumChildren() > 0) { print("/"); } break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException("Unknown PrintModeEnum: " + printMode); @@ -477,12 +541,9 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements print("/"); break; case UNABBREVIATE: - print(AxisEnum.DESCENDANT_OR_SELF.toString()); + print(AxisEnum.DESCENDANT_OR_SELF); print("::node()/"); break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException("Unknown PrintModeEnum: " + printMode); @@ -494,8 +555,13 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTPITest node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print("processing-instruction("); + if (node.getImage() != null) { + print(node.getImage()); + } else { + node.childrenAccept(this, data); + } + print(")"); return data; } @@ -555,15 +621,12 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements if (axisEnum != null) { switch (printMode) { case ABBREVIATE: - print("//"); + print("/"); break; case UNABBREVIATE: - print(axisEnum.toString()); + print(axisEnum); print("::node()/"); break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException( "Unknown PrintModeEnum: " + printMode); @@ -576,26 +639,47 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTReverseAxis node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print(node.getAxis(0)); + print("::"); return data; } public Object visit(ASTReverseStep node, Object data) { - // Nothing to do - node.childrenAccept(this, data); + switch (printMode) { + case ABBREVIATE: + if (node.jjtGetNumChildren() == 2) { + if (((ASTReverseAxis) node.jjtGetChild(0)).getAxis(0) == AxisEnum.PARENT) { + if (node.jjtGetChild(1).jjtGetChild(0) instanceof ASTKindTest) { + if (node.jjtGetChild(1).jjtGetChild(0).jjtGetChild(0) instanceof ASTAnyKindTest) { + print(".."); + break; + } + } + } + } + node.childrenAccept(this, data); + break; + case UNABBREVIATE: + node.childrenAccept(this, data); + break; + default: + throw new IllegalStateException("Unknown PrintModeEnum: " + + printMode); + } return data; } public Object visit(ASTSchemaAttributeTest node, Object data) { - TODO(node); + print("schema-attribute("); node.childrenAccept(this, data); + print(")"); return data; } public Object visit(ASTSchemaElementTest node, Object data) { - TODO(node); + print("schema-element("); node.childrenAccept(this, data); + print(")"); return data; } @@ -637,15 +721,12 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTStringLiteral node, Object data) { - // TODO For String literals, need functions to de-escape and escape with - // either a ' or a ". print(node.getImage()); return data; } public Object visit(ASTTextTest node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print("text()"); return data; } @@ -655,14 +736,13 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTTypeName node, Object data) { - TODO(node); - node.childrenAccept(this, data); + print(node.getImage()); return data; } public Object visit(ASTUnaryExpr node, Object data) { for (int i = 0; i < node.getNumOperators(); i++) { - print(node.getOperator(i).toString()); + print(node.getOperator(i)); } node.childrenAccept(this, data); return data; @@ -677,9 +757,6 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements case UNABBREVIATE: separator = " union "; break; - case PRESERVE: - // TODO - throw new IllegalStateException("Not yet implemented!"); default: throw new IllegalStateException("Unknown PrintModeEnum: " + printMode); @@ -689,9 +766,8 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(ASTValueComp node, Object data) { - TODO(node); - node.childrenAccept(this, data); - return data; + // Nothing to do + throw new IllegalStateException("Should not be here!"); } public Object visit(ASTValueExpr node, Object data) { @@ -731,8 +807,7 @@ public class PrintXPath2ParserVisitor extends AbstractPrintVisitor implements } public Object visit(SimpleNode node, Object data) { - TODO(node); - node.childrenAccept(this, data); - return data; + // Nothing to do + throw new IllegalStateException("Should not be here!"); } } diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/AxisEnum.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/AxisEnum.java index ca88bb7208..ccdafa6ed3 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/AxisEnum.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/AxisEnum.java @@ -45,7 +45,7 @@ public enum AxisEnum { /** * TODO Document */ - PRECEDING_SIBLINGS("preceding-siblings", false), + PRECEDING_SIBLING("preceding-sibling", false), /** * TODO Document */ diff --git a/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/NodeAccessorAxisNavigator.java b/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/NodeAccessorAxisNavigator.java index ac1702f2f9..f26002964c 100644 --- a/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/NodeAccessorAxisNavigator.java +++ b/pmd-jerry/src/net/sourceforge/pmd/jerry/xpath/NodeAccessorAxisNavigator.java @@ -66,7 +66,7 @@ public class NodeAccessorAxisNavigator implements AxisNavigator { case ANCESTOR: // TODO break; - case PRECEDING_SIBLINGS: + case PRECEDING_SIBLING: // TODO break; case PRECEDING: diff --git a/pmd-jerry/test/test/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTest.java b/pmd-jerry/test/test/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTest.java index 6af29ff4f5..279c403c1e 100644 --- a/pmd-jerry/test/test/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTest.java +++ b/pmd-jerry/test/test/net/sourceforge/pmd/jerry/ast/xpath/XPath2ParserTest.java @@ -50,96 +50,130 @@ public class XPath2ParserTest extends TestCase { } private static final Query[] VALID_QUERIES = { - /* - * new Query("1,1", "1, 1", "1, 1"), new - * Query("(fn:root(self::node()) treat as document-node())", null, - * null), new Query("foo -foo", "foo - foo", "child::foo - - * child::foo"), new Query("foo(: This is a comment :)- foo", "foo - - * foo", "child::foo - child::foo"), new Query("foo-foo", null, - * "child::foo-foo"), new Query( "foo (: commenting out a (: comment :) - * may be confusing, but often helpful :)", "foo", "child::foo"), - * new Query("for (: set up loop :) $i in $x return $i", "for $i in - * $x return $i", "for $i in $x return $i"), new Query( "for (: set - * up loop :) $i in $x,$j in $y,$k in $z return $i", "for $i in $x, - * $j in $y, $k in $z return $i", "for $i in $x, $j in $y, $k in $z - * return $i"), new Query( "5 instance (: strange place for a - * comment :) of xs:integer", "5 instance of xs:integer", "5 - * instance of xs:integer"), new Query("/", null, - * "fn:root(self::node()) treat as document-node()"), new - * Query("/*", null, "fn:root(self::node()) treat as - * document-node()/child::*"), new Query("/ *", "/*", - * "fn:root(self::node()) treat as document-node()/child::*"), new - * Query("(/) * 5", null, "(fn:root(self::node()) treat as - * document-node()) * 5"), new Query("4", null, null), new - * Query("-4", null, null), new Query("+4", null, null), new - * Query("+--4", null, null), new Query("-++4", null, null), new - * Query("-+-+--+4", null, null), new Query("4 + (/) * 5", null, "4 + - * (fn:root(self::node()) treat as document-node()) * 5"), new - * Query("4 + /", null, "4 + fn:root(self::node()) treat as - * document-node()"), new Query("4 | 5", null, "4 union 5"), new - * Query("4 union 5", "4 | 5", null), new Query("4 intersect 5", - * null, null), new Query("4 except 5", null, null), new Query("4 - * treat as xs:integer", null, null), new Query( "if - * ($widget1/unit-cost < $widget2/unit-cost)" + EOL + "then - * $widget1" + EOL + "else $widget2", "if ($widget1/unit-cost < - * $widget2/unit-cost) then $widget1 else $widget2", "if - * ($widget1/child::unit-cost < $widget2/child::unit-cost) then - * $widget1 else $widget2"), new Query( "if ($part/@discounted)" + - * EOL + "then $part/wholesale" + EOL + "else $part/retail", "if - * ($part/@discounted) then $part/wholesale else $part/retail", "if - * ($part/attribute::discounted) then $part/child::wholesale else - * $part/child::retail"), new Query("($x div $y) + xs:decimal($z)", - * null, null), new Query( "fn:error(xs:QName(\"app:err057\"), - * \"Unexpected value\", fn:string($v))", null, null), new - * Query("'this is a string with '' apostrophes and \" quotes!'", - * null, null), new Query( "\"this is a string with ' apostrophes - * and \"\" quotes!\"", null, null), new Query( "//book[author eq - * 'Berners-Lee']", null, "fn:root(self::node()) treat as - * document-node()/descendant-or-self::node()/child::book[child::author - * eq 'Berners-Lee']"), new Query("some $x in $expr1 satisfies $x = - * 47", null, null), new Query("some $x in $expr1, $y in $expr2 - * satisfies $x = 47", null, null), new Query("every $x in $expr1 - * satisfies $x = 47", null, null), new Query("every $x in $expr1, - * $y in $expr2 satisfies $x = 47", null, null), new Query( - * "//product[id = 47]", null, "fn:root(self::node()) treat as - * document-node()/descendant-or-self::node()/child::product[child::id = - * 47]"), new Query( "//product[id = 47]/following::node()/part[id = - * 48]", null, "fn:root(self::node()) treat as - * document-node()/descendant-or-self::node()/child::product[child::id = - * 47]/following::node()/child::part[child::id = 48]"), new Query( - * "//part[color eq \"Red\"]", null, "fn:root(self::node()) treat as - * document-node()/descendant-or-self::node()/child::part[child::color - * eq \"Red\"]"), new Query( "//part[color = \"Red\"][color eq - * \"Red\"]", null, "fn:root(self::node()) treat as - * document-node()/descendant-or-self::node()/child::part[child::color = - * \"Red\"][child::color eq \"Red\"]"), new Query( "$N[@x castable - * as xs:date][xs:date(@x) gt xs:date(\"2000-01-01\")]", null, - * "$N[attribute::x castable as xs:date][xs:date(attribute::x) gt - * xs:date(\"2000-01-01\")]"), new Query( "$N[if (@x castable as - * xs:date)" + EOL + "then xs:date(@x) gt xs:date(\"2000-01-01\")" + - * EOL + "else false()]", "$N[if (@x castable as xs:date) then - * xs:date(@x) gt xs:date(\"2000-01-01\") else false()]", - * - * "$N[if (attribute::x castable as xs:date) then - * xs:date(attribute::x) gt xs:date(\"2000-01-01\") else false()]"), - * new Query("\"12.5\"", null, null), new Query("12", null, null), - * new Query("12.5", null, null), new Query("125E2", null, null), - * new Query("\"He said, \"\"I don't like it.\"\"\"", null, null), - * new Query("9 cast as hatsize", null, null), new Query("9 cast as - * hatsize?", null, null), new - * Query("fn:doc(\"bib.xml\")/books/book[fn:count(./author)>1]", - * "fn:doc(\"bib.xml\")/books/book[fn:count(./author) > 1]", - * "fn:doc(\"bib.xml\")/child::books/child::book[fn:count(./child::author) > - * 1]"), new Query("(1 to 100)[. mod 5 eq 0]", null, null), new - * Query("my:three-argument-function(1, 2, 3)", null, null), new - * Query("my:two-argument-function((1, 2), 3)", null, null), new - * Query("my:two-argument-function(1, ())", null, null), new - * Query("my:one-argument-function((1, 2, 3))", null, null), new - * Query("my:one-argument-function(( ))", - * "my:one-argument-function(())", "my:one-argument-function(())"), - * new Query("my:zero-argument-function( )", - * "my:zero-argument-function()", "my:zero-argument-function()"), - */ + + new Query("1,1", "1, 1", "1, 1"), + new Query("(fn:root(self::node()) treat as document-node())", null, + null), + new Query("foo -foo", "foo - foo", "child::foo - child::foo"), + new Query("foo(: This is a comment :)- foo", "foo - foo", + "child::foo - child::foo"), + new Query("foo-foo", null, "child::foo-foo"), + new Query( + "foo (: commenting out a (: comment :) may be confusing, but often helpful :)", + "foo", "child::foo"), + new Query("for (: set up loop :) $i in $x return $i", + "for $i in $x return $i", "for $i in $x return $i"), + new Query( + "for (: set up loop :) $i in $x,$j in $y,$k in $z return $i", + "for $i in $x, $j in $y, $k in $z return $i", + "for $i in $x, $j in $y, $k in $z return $i"), + new Query( + "5 instance (: strange place for a comment :) of xs:integer", + "5 instance of xs:integer", "5 instance of xs:integer"), + new Query("/", null, + "fn:root(self::node()) treat as document-node()"), + new Query("/*", null, + "fn:root(self::node()) treat as document-node()/child::*"), + new Query("/ *", "/*", + "fn:root(self::node()) treat as document-node()/child::*"), + new Query("(/) * 5", null, + "(fn:root(self::node()) treat as document-node()) * 5"), + new Query("4", null, null), + new Query("-4", null, null), + new Query("+4", null, null), + new Query("+--4", null, null), + new Query("-++4", null, null), + new Query("-+-+--+4", null, null), + new Query("4 + (/) * 5", null, + "4 + (fn:root(self::node()) treat as document-node()) * 5"), + new Query("4 + /", null, + "4 + fn:root(self::node()) treat as document-node()"), + new Query("4 | 5", null, "4 union 5"), + new Query("4 union 5", "4 | 5", null), + new Query("4 intersect 5", null, null), + new Query("4 except 5", null, null), + new Query("4 treat as xs:integer", null, null), + new Query("4 treat as xs:integer?", null, null), + new Query("4 treat as xs:integer+", null, null), + new Query("4 treat as xs:integer*", null, null), + new Query( + "if ($widget1/unit-cost < $widget2/unit-cost)" + EOL + + "then $widget1" + EOL + "else $widget2", + "if ($widget1/unit-cost < $widget2/unit-cost) then $widget1 else $widget2", + "if ($widget1/child::unit-cost < $widget2/child::unit-cost) then $widget1 else $widget2"), + new Query( + "if ($part/@discounted)" + EOL + "then $part/wholesale" + + EOL + "else $part/retail", + "if ($part/@discounted) then $part/wholesale else $part/retail", + "if ($part/attribute::discounted) then $part/child::wholesale else $part/child::retail"), + new Query("($x div $y) + xs:decimal($z)", null, null), + new Query( + "fn:error(xs:QName(\"app:err057\"), \"Unexpected value\", fn:string($v))", + null, null), + new Query("'this is a string with '' apostrophes and \" quotes!'", + null, null), + new Query( + "\"this is a string with ' apostrophes and \"\" quotes!\"", + null, null), + new Query( + "//book[author eq 'Berners-Lee']", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::book[child::author eq 'Berners-Lee']"), + new Query("some $x in $expr1 satisfies $x = 47", null, null), + new Query("some $x in $expr1, $y in $expr2 satisfies $x = 47", + null, null), + new Query("every $x in $expr1 satisfies $x = 47", null, null), + new Query("every $x in $expr1, $y in $expr2 satisfies $x = 47", + null, null), + new Query( + "//product[id = 47]", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::product[child::id = 47]"), + new Query( + "//product[id = 47]/following::node()/part[id = 48]", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::product[child::id = 47]/following::node()/child::part[child::id = 48]"), + new Query( + "//part[color eq \"Red\"]", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::part[child::color eq \"Red\"]"), + new Query( + "//part[color = \"Red\"][color eq \"Red\"]", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::part[child::color = \"Red\"][child::color eq \"Red\"]"), + new Query( + "$N[@x castable as xs:date][xs:date(@x) gt xs:date(\"2000-01-01\")]", + null, + "$N[attribute::x castable as xs:date][xs:date(attribute::x) gt xs:date(\"2000-01-01\")]"), + new Query( + "$N[if (@x castable as xs:date)" + EOL + + "then xs:date(@x) gt xs:date(\"2000-01-01\")" + + EOL + "else false()]", + "$N[if (@x castable as xs:date) then xs:date(@x) gt xs:date(\"2000-01-01\") else false()]", + "$N[if (attribute::x castable as xs:date) then xs:date(attribute::x) gt xs:date(\"2000-01-01\") else false()]"), + new Query("\"12.5\"", null, null), + new Query("12", null, null), + new Query("12.5", null, null), + new Query("125E2", null, null), + new Query("\"He said, \"\"I don't like it.\"\"\"", null, null), + new Query("9 cast as hatsize", null, null), + new Query("9 cast as hatsize?", null, null), + new Query("fn:doc(\"bib.xml\")/books/book[fn:count(./author)>1]", + "fn:doc(\"bib.xml\")/books/book[fn:count(./author) > 1]", + "fn:doc(\"bib.xml\")/child::books/child::book[fn:count(./child::author) > 1]"), + new Query("(1 to 100)[. mod 5 eq 0]", null, null), + new Query("my:three-argument-function(1, 2, 3)", null, null), + new Query("my:two-argument-function((1, 2), 3)", null, null), + new Query("my:two-argument-function(1, ())", null, null), + new Query("my:one-argument-function((1, 2, 3))", null, null), + new Query("my:one-argument-function(( ))", + "my:one-argument-function(())", + "my:one-argument-function(())"), + new Query("my:zero-argument-function( )", + "my:zero-argument-function()", + "my:zero-argument-function()"), + new Query("..", null, "parent::node()"), + new Query("parent::node()", "..", null), new Query("child::div1", "div1", null), new Query("child::div1/child::para", "div1/para", null), new Query("child::chapter[2]", "chapter[2]", null), @@ -156,55 +190,76 @@ public class XPath2ParserTest extends TestCase { new Query("\"This string was terminated properly!\"", null, null), new Query("'This string was terminated properly!'", null, null), new Query("\"This string has \"\"escaping\"\"!\"", null, null), - new Query("'This string has ''escaping''!'", null, null), }; + new Query("'This string has ''escaping''!'", null, null), + new Query("para", null, "child::para"), + new Query("*", null, "child::*"), + new Query("text()", null, "child::text()"), + new Query("@name", null, "attribute::name"), + new Query("@*", null, "attribute::*"), + new Query("para[1]", null, "child::para[1]"), + new Query("para[fn:last()]", null, "child::para[fn:last()]"), + new Query("*/para", null, "child::*/child::para"), + new Query( + "/book/chapter[5]/section[2]", + null, + "fn:root(self::node()) treat as document-node()/child::book/child::chapter[5]/child::section[2]"), + new Query("chapter//para", null, + "child::chapter/descendant-or-self::node()/child::para"), + new Query( + "//para", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::para"), + new Query( + "//@version", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/attribute::version"), + new Query( + "//list/member", + null, + "fn:root(self::node()) treat as document-node()/descendant-or-self::node()/child::list/child::member"), + new Query(".//para", null, + "./descendant-or-self::node()/child::para"), + new Query("..", null, "parent::node()"), + new Query("../@lang", null, "parent::node()/attribute::lang"), + new Query("para[@type = \"warning\"]", null, + "child::para[attribute::type = \"warning\"]"), + new Query("para[@type = \"warning\"][5]", null, + "child::para[attribute::type = \"warning\"][5]"), + new Query("para[5][@type = \"warning\"]", null, + "child::para[5][attribute::type = \"warning\"]"), + new Query("chapter[title = \"Introduction\"]", null, + "child::chapter[child::title = \"Introduction\"]"), + new Query("chapter[title]", null, "child::chapter[child::title]"), + new Query("employee[@secretary and @assistant]", null, + "child::employee[attribute::secretary and attribute::assistant]"), + new Query("book/(chapter | appendix)/section", null, + "child::book/(child::chapter union child::appendix)/child::section"), + new Query("E/.", null, "child::E/."), + new Query("section/@id", null, "child::section/attribute::id"), + new Query("section/attribute(id)", null, + "child::section/attribute::attribute(id)"), + new Query("section/schema-attribute(id)", null, + "child::section/attribute::schema-attribute(id)"), + new Query("section/schema-element(id)", null, + "child::section/child::schema-element(id)"), + new Query("element()", null, "child::element()"), + new Query("element(cat)", null, "child::element(cat)"), + new Query("element(cat, cheshire)", null, + "child::element(cat, cheshire)"), + new Query("element(cat, cheshire?)", null, + "child::element(cat, cheshire?)"), + new Query("processing-instruction()", null, + "child::processing-instruction()"), + new Query("processing-instruction('cat')", null, + "child::processing-instruction('cat')"), }; - /* - * private static final String[] VALID_QUERIES = { "1,1", - * "(fn:root(self::node()) treat as document-node())", "foo -foo", "foo(: - * This is a comment :)- foo", "foo-foo", "foo (: commenting out a (: - * comment :) may be confusing, but often helpful :)", "for (: set up loop :) - * $i in $x return $i", "for (: set up loop :) $i in $x,$j in $y,$k in $z - * return $i", "5 instance (: strange place for a comment :) of xs:integer", - * "/", "/*", "/ *", "(/) * 5", "4", "-4", "+4", "+--4", "-++4", "-+-+--+4", - * "4 + (/) * 5", "4 + /", "4 | 5", "4 union 5", "4 intersect 5", "4 except - * 5", "4 treat as xs:integer", "if ($widget1/unit-cost < - * $widget2/unit-cost)" + EOL + "then $widget1" + EOL + "else $widget2", "if - * ($part/@discounted)" + EOL + "then $part/wholesale" + EOL + "else - * $part/retail", "($x div $y) + xs:decimal($z)", - * "fn:error(xs:QName(\"app:err057\"), \"Unexpected value\", - * fn:string($v))", "'this is a string with '' apostrophes and \" quotes!'", - * "\"this is a string with ' apostrophes and \"\" quotes!\"", - * "//book[author eq 'Berners-Lee']", "some $x in $expr1 satisfies $x = 47", - * "some $x in $expr1, $y in $expr2 satisfies $x = 47", "every $x in $expr1 - * satisfies $x = 47", "every $x in $expr1, $y in $expr2 satisfies $x = 47", - * "//product[id = 47]", "//product[id = 47]/following::node()/part[id = - * 48]", "//part[color eq \"Red\"]", "//part[color = \"Red\"][color eq - * \"Red\"]", "$N[@x castable as xs:date][xs:date(@x) gt - * xs:date(\"2000-01-01\")]", "$N[if (@x castable as xs:date)" + EOL + "then - * xs:date(@x) gt xs:date(\"200-01-01\")" + EOL + "else false()]", - * "\"12.5\"", "12", "12.5", "125E2", "\"He said, \"\"I don't like - * it.\"\"\"", "9 cast as hatsize", "\"He said, \"\"I don't like it.\"\"\"", - * "9 cast as hatsize?", - * "fn:doc(\"bib.xml\")/books/book[fn:count(./author)>1]", "(1 to 100)[. mod - * 5 eq 0]", "my:three-argument-function(1, 2, 3)", - * "my:two-argument-function((1, 2), 3)", "my:two-argument-function(1, ())", - * "my:one-argument-function((1, 2, 3))", "my:one-argument-function(( ))", - * "my:zero-argument-function( )", "child::div1/child::para", - * "child::chapter[2]", "descendant::toy[attribute::color = \"red\"]", - * "child::employee[secretary][assistant]", "div1//para", - * "child::div1/descendant-or-self::node()/child::para", "\"This string was - * terminated properly!\"", "'This string was terminated properly!'", - * "\"This string has \"\"escaping\"\"!\"", "'This string has - * ''escaping''!'", }; - * - */ private static final String[] INVALID_QUERIES = { "foo- foo", "/*5", "/ * 5", "4 + / * 5", "10div 3", "10 div3", "10div3", "\"This string was not terminated properly!", "\'This string was not terminated properly!", "\"This string has missing \"escaping\"!\"", "'This string has missing 'escaping'!'", - "5 (: This is a unterminated comment!", }; + "5 (: This is a unterminated comment!", "//" }; public void testValidQueries() { for (int i = 0; i < VALID_QUERIES.length; i++) { @@ -217,21 +272,26 @@ public class XPath2ParserTest extends TestCase { // 2) Unabbreviate(XPath) == // Unabbreviate(Abbreviate(Unabbreviate(XPath))) - PrintXPath2ParserVisitor printVisitor = new PrintXPath2ParserVisitor( - PrintXPath2ParserVisitor.PrintModeEnum.ABBREVIATE); - xpath.jjtAccept(printVisitor, null); - System.out - .println("Abbreviated: " + printVisitor.getOutput()); - assertEquals("Abbreviated", query.getAbbreviated(), - printVisitor.getOutput()); + // Check: Abbreviated(XPath) + String abbreviated = PrintXPath2ParserVisitor.abbreviate(query + .getXpath()); + System.out.println("Abbreviated: " + abbreviated); + assertEquals("Abbreviate", query.getAbbreviated(), abbreviated); - printVisitor = new PrintXPath2ParserVisitor( - PrintXPath2ParserVisitor.PrintModeEnum.UNABBREVIATE); - xpath.jjtAccept(printVisitor, null); - System.out - .println("Unabbreviated: " + printVisitor.getOutput()); - assertEquals("Abbreviated", query.getUnabbreviated(), - printVisitor.getOutput()); + // Check: Unabbreviated(XPath) + String unabbreviated = PrintXPath2ParserVisitor + .unabbreviate(query.getXpath()); + System.out.println("Unabbreviated: " + unabbreviated); + assertEquals("Unabbreviate", query.getUnabbreviated(), + unabbreviated); + + // Check: Unabbreviate(Abbreviate(XPath)) + assertEquals("Abbreviate->Unabbreviate", unabbreviated, + PrintXPath2ParserVisitor.unabbreviate(abbreviated)); + + // Check: Abbreviate(Unabbreviate(XPath)) + assertEquals("Unabbreviate->Abbreviate", abbreviated, + PrintXPath2ParserVisitor.abbreviate(unabbreviated)); // CoreXPath2ParserVisitor visitor = new // CoreXPath2ParserVisitor();