XPath: Slightly optimized lexer
git-svn-id: http://pugixml.googlecode.com/svn/trunk@487 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
parent
8af48d7e23
commit
88bdad514c
@ -885,44 +885,46 @@ namespace pugi
|
|||||||
{
|
{
|
||||||
contents_clear();
|
contents_clear();
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_space)) ++m_cur;
|
const char_t* cur = m_cur;
|
||||||
|
|
||||||
switch (*m_cur)
|
while (IS_CHARTYPEX(*cur, ctx_space)) ++cur;
|
||||||
|
|
||||||
|
switch (*cur)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_cur_lexeme = lex_eof;
|
m_cur_lexeme = lex_eof;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '>':
|
case '>':
|
||||||
if (*(m_cur+1) == '=')
|
if (*(cur+1) == '=')
|
||||||
{
|
{
|
||||||
m_cur += 2;
|
cur += 2;
|
||||||
m_cur_lexeme = lex_greater_or_equal;
|
m_cur_lexeme = lex_greater_or_equal;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_greater;
|
m_cur_lexeme = lex_greater;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '<':
|
case '<':
|
||||||
if (*(m_cur+1) == '=')
|
if (*(cur+1) == '=')
|
||||||
{
|
{
|
||||||
m_cur += 2;
|
cur += 2;
|
||||||
m_cur_lexeme = lex_less_or_equal;
|
m_cur_lexeme = lex_less_or_equal;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_less;
|
m_cur_lexeme = lex_less;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '!':
|
case '!':
|
||||||
if (*(m_cur+1) == '=')
|
if (*(cur+1) == '=')
|
||||||
{
|
{
|
||||||
m_cur += 2;
|
cur += 2;
|
||||||
m_cur_lexeme = lex_not_equal;
|
m_cur_lexeme = lex_not_equal;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -932,111 +934,111 @@ namespace pugi
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '=':
|
case '=':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_equal;
|
m_cur_lexeme = lex_equal;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '+':
|
case '+':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_plus;
|
m_cur_lexeme = lex_plus;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '-':
|
case '-':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_minus;
|
m_cur_lexeme = lex_minus;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '*':
|
case '*':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_multiply;
|
m_cur_lexeme = lex_multiply;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '|':
|
case '|':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_union;
|
m_cur_lexeme = lex_union;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '$':
|
case '$':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_var_ref;
|
m_cur_lexeme = lex_var_ref;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '(':
|
case '(':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_open_brace;
|
m_cur_lexeme = lex_open_brace;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ')':
|
case ')':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_close_brace;
|
m_cur_lexeme = lex_close_brace;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '[':
|
case '[':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_open_square_brace;
|
m_cur_lexeme = lex_open_square_brace;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ']':
|
case ']':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_close_square_brace;
|
m_cur_lexeme = lex_close_square_brace;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ',':
|
case ',':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_comma;
|
m_cur_lexeme = lex_comma;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '/':
|
case '/':
|
||||||
if (*(m_cur+1) == '/')
|
if (*(cur+1) == '/')
|
||||||
{
|
{
|
||||||
m_cur += 2;
|
cur += 2;
|
||||||
m_cur_lexeme = lex_double_slash;
|
m_cur_lexeme = lex_double_slash;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_slash;
|
m_cur_lexeme = lex_slash;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '.':
|
case '.':
|
||||||
if (*(m_cur+1) == '.')
|
if (*(cur+1) == '.')
|
||||||
{
|
{
|
||||||
m_cur += 2;
|
cur += 2;
|
||||||
m_cur_lexeme = lex_double_dot;
|
m_cur_lexeme = lex_double_dot;
|
||||||
}
|
}
|
||||||
else if (IS_CHARTYPEX(*(m_cur+1), ctx_digit))
|
else if (IS_CHARTYPEX(*(cur+1), ctx_digit))
|
||||||
{
|
{
|
||||||
m_cur_lexeme_contents.begin = m_cur; // .
|
m_cur_lexeme_contents.begin = cur; // .
|
||||||
|
|
||||||
++m_cur;
|
++cur;
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_digit)) m_cur++;
|
while (IS_CHARTYPEX(*cur, ctx_digit)) cur++;
|
||||||
|
|
||||||
m_cur_lexeme_contents.end = m_cur;
|
m_cur_lexeme_contents.end = cur;
|
||||||
|
|
||||||
m_cur_lexeme = lex_number;
|
m_cur_lexeme = lex_number;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_dot;
|
m_cur_lexeme = lex_dot;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '@':
|
case '@':
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_axis_attribute;
|
m_cur_lexeme = lex_axis_attribute;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1044,19 +1046,19 @@ namespace pugi
|
|||||||
case '"':
|
case '"':
|
||||||
case '\'':
|
case '\'':
|
||||||
{
|
{
|
||||||
char_t terminator = *m_cur;
|
char_t terminator = *cur;
|
||||||
|
|
||||||
++m_cur;
|
++cur;
|
||||||
|
|
||||||
m_cur_lexeme_contents.begin = m_cur;
|
m_cur_lexeme_contents.begin = cur;
|
||||||
while (*m_cur && *m_cur != terminator) m_cur++;
|
while (*cur && *cur != terminator) cur++;
|
||||||
m_cur_lexeme_contents.end = m_cur;
|
m_cur_lexeme_contents.end = cur;
|
||||||
|
|
||||||
if (!*m_cur)
|
if (!*cur)
|
||||||
m_cur_lexeme = lex_none;
|
m_cur_lexeme = lex_none;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_cur += 1;
|
cur += 1;
|
||||||
m_cur_lexeme = lex_quoted_string;
|
m_cur_lexeme = lex_quoted_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1064,9 +1066,9 @@ namespace pugi
|
|||||||
}
|
}
|
||||||
|
|
||||||
case ':':
|
case ':':
|
||||||
if (*(m_cur+1) == ':')
|
if (*(cur+1) == ':')
|
||||||
{
|
{
|
||||||
m_cur += 2;
|
cur += 2;
|
||||||
m_cur_lexeme = lex_double_colon;
|
m_cur_lexeme = lex_double_colon;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1076,46 +1078,46 @@ namespace pugi
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (IS_CHARTYPEX(*m_cur, ctx_digit))
|
if (IS_CHARTYPEX(*cur, ctx_digit))
|
||||||
{
|
{
|
||||||
m_cur_lexeme_contents.begin = m_cur;
|
m_cur_lexeme_contents.begin = cur;
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_digit)) m_cur++;
|
while (IS_CHARTYPEX(*cur, ctx_digit)) cur++;
|
||||||
|
|
||||||
if (*m_cur == '.')
|
if (*cur == '.')
|
||||||
{
|
{
|
||||||
m_cur++;
|
cur++;
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_digit)) m_cur++;
|
while (IS_CHARTYPEX(*cur, ctx_digit)) cur++;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_cur_lexeme_contents.end = m_cur;
|
m_cur_lexeme_contents.end = cur;
|
||||||
|
|
||||||
m_cur_lexeme = lex_number;
|
m_cur_lexeme = lex_number;
|
||||||
}
|
}
|
||||||
else if (IS_CHARTYPEX(*m_cur, ctx_start_symbol))
|
else if (IS_CHARTYPEX(*cur, ctx_start_symbol))
|
||||||
{
|
{
|
||||||
m_cur_lexeme_contents.begin = m_cur;
|
m_cur_lexeme_contents.begin = cur;
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_symbol)) m_cur++;
|
while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
|
||||||
|
|
||||||
if (m_cur[0] == ':')
|
if (cur[0] == ':')
|
||||||
{
|
{
|
||||||
if (m_cur[1] == '*') // namespace test ncname:*
|
if (cur[1] == '*') // namespace test ncname:*
|
||||||
{
|
{
|
||||||
m_cur += 2; // :*
|
cur += 2; // :*
|
||||||
}
|
}
|
||||||
else if (IS_CHARTYPEX(m_cur[1], ctx_symbol)) // namespace test qname
|
else if (IS_CHARTYPEX(cur[1], ctx_symbol)) // namespace test qname
|
||||||
{
|
{
|
||||||
m_cur++; // :
|
cur++; // :
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_symbol)) m_cur++;
|
while (IS_CHARTYPEX(*cur, ctx_symbol)) cur++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_cur_lexeme_contents.end = m_cur;
|
m_cur_lexeme_contents.end = cur;
|
||||||
|
|
||||||
while (IS_CHARTYPEX(*m_cur, ctx_space)) ++m_cur;
|
while (IS_CHARTYPEX(*cur, ctx_space)) ++cur;
|
||||||
|
|
||||||
m_cur_lexeme = lex_string;
|
m_cur_lexeme = lex_string;
|
||||||
}
|
}
|
||||||
@ -1124,6 +1126,8 @@ namespace pugi
|
|||||||
throw xpath_exception("Unrecognized token");
|
throw xpath_exception("Unrecognized token");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_cur = cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
lexeme_t current() const
|
lexeme_t current() const
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user