Fixed XPath parsing (numbers of the form \d+\. are now parsed correctly, stray colon does not act as eof token)

git-svn-id: http://pugixml.googlecode.com/svn/trunk@476 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
arseny.kapoulkine 2010-05-30 20:44:15 +00:00
parent 97a761615f
commit 555a184f4f
3 changed files with 11 additions and 10 deletions

View File

@ -861,7 +861,8 @@ namespace pugi
lex_axis_attribute, lex_axis_attribute,
lex_dot, lex_dot,
lex_double_dot, lex_double_dot,
lex_double_colon lex_double_colon,
lex_eof
}; };
struct xpath_lexer_string struct xpath_lexer_string
@ -926,7 +927,7 @@ namespace pugi
switch (*m_cur) switch (*m_cur)
{ {
case 0: case 0:
m_cur_lexeme = lex_none; m_cur_lexeme = lex_eof;
break; break;
case '>': case '>':
@ -1118,7 +1119,7 @@ namespace pugi
while (IS_CHARTYPEX(*m_cur, ctx_digit)) m_cur++; while (IS_CHARTYPEX(*m_cur, ctx_digit)) m_cur++;
if (*m_cur == '.' && IS_CHARTYPEX(*(m_cur+1), ctx_digit)) if (*m_cur == '.')
{ {
m_cur++; m_cur++;
@ -3558,7 +3559,7 @@ namespace pugi
{ {
xpath_ast_node* result = parse_expression(); xpath_ast_node* result = parse_expression();
if (m_lexer.current() != lex_none) if (m_lexer.current() != lex_eof)
{ {
// there are still unparsed tokens left, error // there are still unparsed tokens left, error
throw xpath_exception("Incorrect query"); throw xpath_exception("Incorrect query");

View File

@ -29,6 +29,7 @@ TEST(xpath_number_parse)
CHECK_XPATH_NUMBER(c, STR("123.456"), 123.456); CHECK_XPATH_NUMBER(c, STR("123.456"), 123.456);
CHECK_XPATH_NUMBER(c, STR(".123"), 0.123); CHECK_XPATH_NUMBER(c, STR(".123"), 0.123);
CHECK_XPATH_NUMBER(c, STR("123.4567890123456789012345"), 123.4567890123456789012345); CHECK_XPATH_NUMBER(c, STR("123.4567890123456789012345"), 123.4567890123456789012345);
CHECK_XPATH_NUMBER(c, STR("123."), 123);
} }
TEST(xpath_number_error) TEST(xpath_number_error)
@ -225,12 +226,11 @@ TEST(xpath_parse_jaxen_invalid)
STR("///triple slash"), STR("/numbers numbers"), STR("/a/b[c > d]efg"), STR("/inv/child::"), STR("/invoice/@test[abcd"), STR("///triple slash"), STR("/numbers numbers"), STR("/a/b[c > d]efg"), STR("/inv/child::"), STR("/invoice/@test[abcd"),
STR("/invoice/@test[abcd > x"), STR("string-length('a"), STR("/descendant::()"), STR("(1 + 1"), STR("!false()"), STR("/invoice/@test[abcd > x"), STR("string-length('a"), STR("/descendant::()"), STR("(1 + 1"), STR("!false()"),
STR("$author"), STR("10 + $foo"), STR("$foo:bar"), STR("$varname[@a='1']"), STR("foo/$variable/foo"), STR("$author"), STR("10 + $foo"), STR("$foo:bar"), STR("$varname[@a='1']"), STR("foo/$variable/foo"),
STR(".[1]"), STR("chyld::foo"), STR("foo/tacos()"), STR("foo/tacos()"), STR("/foo/bar[baz"), STR("//"), // STR("*:foo"), $$ should not compile STR(".[1]"), STR("chyld::foo"), STR("foo/tacos()"), STR("foo/tacos()"), STR("/foo/bar[baz"), STR("//"), STR("*:foo"),
STR("/cracker/cheese[(mold > 1) and (sense/taste"), STR("/cracker/cheese[(mold > 1) and (sense/taste"),
// From xpath-as3 tests // From xpath-as3 tests
STR("a b"), STR("//self::node())"), STR("/x/y[contains(self::node())"), STR("/x/y[contains(self::node()]"), STR("///"), STR("a b"), STR("//self::node())"), STR("/x/y[contains(self::node())"), STR("/x/y[contains(self::node()]"), STR("///"), STR("text::a"),
STR("text::a"), // STR("***"), $$ should not compile
// From haXe-xpath tests // From haXe-xpath tests
STR("|/gjs"), STR("+3"), STR("/html/body/p != ---'div'/a"), STR(""), STR("@"), STR("#akf"), STR(",") STR("|/gjs"), STR("+3"), STR("/html/body/p != ---'div'/a"), STR(""), STR("@"), STR("#akf"), STR(",")

View File

@ -68,8 +68,8 @@ TEST_XML(xpath_xalan_select_6, "<div div='20' div-5='12'>9</div>")
CHECK_XPATH_NUMBER(doc, STR("(* - 4) div 2"), 2.5); CHECK_XPATH_NUMBER(doc, STR("(* - 4) div 2"), 2.5);
CHECK_XPATH_NUMBER(doc, STR("' 6 ' div 2"), 3); CHECK_XPATH_NUMBER(doc, STR("' 6 ' div 2"), 3);
CHECK_XPATH_NUMBER(doc, STR("' 6 '*div"), 54); CHECK_XPATH_NUMBER(doc, STR("' 6 '*div"), 54);
// CHECK_XPATH_NUMBER(doc, STR("5.*."), 45); $$ should work CHECK_XPATH_NUMBER(doc, STR("5.*."), 45);
// CHECK_XPATH_NUMBER(doc, STR("5.+."), 14); $$ should work CHECK_XPATH_NUMBER(doc, STR("5.+."), 14);
} }
TEST_XML(xpath_xalan_select_7, "<doc div='20'><div>9</div><attribute>8</attribute></doc>") TEST_XML(xpath_xalan_select_7, "<doc div='20'><div>9</div><attribute>8</attribute></doc>")
@ -235,7 +235,7 @@ TEST(xpath_xalan_error_namespace)
CHECK_XPATH_FAIL(STR("namespace-uri(baz2:b,..)")); CHECK_XPATH_FAIL(STR("namespace-uri(baz2:b,..)"));
CHECK_XPATH_FAIL(STR("name(a,b)")); CHECK_XPATH_FAIL(STR("name(a,b)"));
CHECK_XPATH_FAIL(STR(":foo")); CHECK_XPATH_FAIL(STR(":foo"));
// CHECK_XPATH_FAIL(STR("*:foo")); $$ should not compile CHECK_XPATH_FAIL(STR("*:foo"));
} }
TEST(xpath_xalan_error_position) TEST(xpath_xalan_error_position)