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(); 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