diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pugixml.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 1a69a8e..7981d16 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -5946,13 +5946,34 @@ namespace pugi _cur_lexeme = lex_union; break; - + case '$': cur += 1; - _cur_lexeme = lex_var_ref; + + if (IS_CHARTYPEX(*cur, ctx_start_symbol)) + { + _cur_lexeme_contents.begin = cur; + + while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + + if (cur[0] == ':' && IS_CHARTYPEX(cur[1], ctx_symbol)) // qname + { + cur++; // : + + while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++; + } + + _cur_lexeme_contents.end = cur; + + _cur_lexeme = lex_var_ref; + } + else + { + _cur_lexeme = lex_none; + } break; - + case '(': cur += 1; _cur_lexeme = lex_open_brace; @@ -6124,7 +6145,7 @@ namespace pugi const xpath_lexer_string& contents() const { - assert(_cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string); + assert(_cur_lexeme == lex_var_ref || _cur_lexeme == lex_number || _cur_lexeme == lex_string || _cur_lexeme == lex_quoted_string); return _cur_lexeme_contents; } @@ -7738,16 +7759,11 @@ namespace pugi { case lex_var_ref: { - _lexer.next(); - - if (_lexer.current() != lex_string) - throw_error("Variable name expected"); + xpath_lexer_string name = _lexer.contents(); if (!_variables) throw_error("Unknown variable: variable set is not provided"); - xpath_lexer_string name = _lexer.contents(); - xpath_variable* var = get_variable(_variables, name.begin, name.end); if (!var) |