XPath: Slightly optimized lexer

git-svn-id: http://pugixml.googlecode.com/svn/trunk@487 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
arseny.kapoulkine 2010-05-31 16:57:51 +00:00
parent 8af48d7e23
commit 88bdad514c

View File

@ -885,44 +885,46 @@ namespace pugi
{
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:
m_cur_lexeme = lex_eof;
break;
case '>':
if (*(m_cur+1) == '=')
if (*(cur+1) == '=')
{
m_cur += 2;
cur += 2;
m_cur_lexeme = lex_greater_or_equal;
}
else
{
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_greater;
}
break;
case '<':
if (*(m_cur+1) == '=')
if (*(cur+1) == '=')
{
m_cur += 2;
cur += 2;
m_cur_lexeme = lex_less_or_equal;
}
else
{
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_less;
}
break;
case '!':
if (*(m_cur+1) == '=')
if (*(cur+1) == '=')
{
m_cur += 2;
cur += 2;
m_cur_lexeme = lex_not_equal;
}
else
@ -932,111 +934,111 @@ namespace pugi
break;
case '=':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_equal;
break;
case '+':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_plus;
break;
case '-':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_minus;
break;
case '*':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_multiply;
break;
case '|':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_union;
break;
case '$':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_var_ref;
break;
case '(':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_open_brace;
break;
case ')':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_close_brace;
break;
case '[':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_open_square_brace;
break;
case ']':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_close_square_brace;
break;
case ',':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_comma;
break;
case '/':
if (*(m_cur+1) == '/')
if (*(cur+1) == '/')
{
m_cur += 2;
cur += 2;
m_cur_lexeme = lex_double_slash;
}
else
{
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_slash;
}
break;
case '.':
if (*(m_cur+1) == '.')
if (*(cur+1) == '.')
{
m_cur += 2;
cur += 2;
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;
}
else
{
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_dot;
}
break;
case '@':
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_axis_attribute;
break;
@ -1044,19 +1046,19 @@ namespace pugi
case '"':
case '\'':
{
char_t terminator = *m_cur;
char_t terminator = *cur;
++m_cur;
++cur;
m_cur_lexeme_contents.begin = m_cur;
while (*m_cur && *m_cur != terminator) m_cur++;
m_cur_lexeme_contents.end = m_cur;
m_cur_lexeme_contents.begin = cur;
while (*cur && *cur != terminator) cur++;
m_cur_lexeme_contents.end = cur;
if (!*m_cur)
if (!*cur)
m_cur_lexeme = lex_none;
else
{
m_cur += 1;
cur += 1;
m_cur_lexeme = lex_quoted_string;
}
@ -1064,9 +1066,9 @@ namespace pugi
}
case ':':
if (*(m_cur+1) == ':')
if (*(cur+1) == ':')
{
m_cur += 2;
cur += 2;
m_cur_lexeme = lex_double_colon;
}
else
@ -1076,46 +1078,46 @@ namespace pugi
break;
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;
}
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;
}
@ -1124,6 +1126,8 @@ namespace pugi
throw xpath_exception("Unrecognized token");
}
}
m_cur = cur;
}
lexeme_t current() const