eolian: lexing of multichar binary operators

This commit is contained in:
Daniel Kolesa 2014-07-18 11:48:40 +01:00
parent 62541ce484
commit 96f360a7d1
3 changed files with 52 additions and 6 deletions

View File

@ -44,7 +44,7 @@ next_char(Eo_Lexer *ls)
static const char * const tokens[] =
{
"==", "!=", ">", "<", ">=", "<=", "&&", "||", "<<", ">>",
"==", "!=", ">=", "<=", "&&", "||", "<<", ">>",
"<comment>", "<string>", "<number>", "<value>",
@ -106,7 +106,7 @@ init_hash(void)
unsigned int i, u;
if (keyword_map) return;
keyword_map = eina_hash_string_superfast_new(NULL);
for (i = u = 14; i < (sizeof(tokens) / sizeof(const char*)); ++i)
for (i = u = 12; i < (sizeof(tokens) / sizeof(const char*)); ++i)
{
eina_hash_add(keyword_map, tokens[i], (void*)(size_t)(i - u + 1));
}
@ -484,6 +484,52 @@ lex(Eo_Lexer *ls, Eo_Token *tok)
continue;
case '\0':
return -1;
case '=':
next_char(ls);
if (ls->current != '=') return '=';
next_char(ls);
return TOK_EQ;
case '!':
next_char(ls);
if (ls->current != '=') return '!';
next_char(ls);
return TOK_NQ;
case '>':
next_char(ls);
if (ls->current == '=')
{
next_char(ls);
return TOK_GE;
}
else if (ls->current == '>')
{
next_char(ls);
return TOK_RSH;
}
return '>';
case '<':
next_char(ls);
if (ls->current == '=')
{
next_char(ls);
return TOK_LE;
}
else if (ls->current == '<')
{
next_char(ls);
return TOK_LSH;
}
return '<';
case '&':
next_char(ls);
if (ls->current != '&') return '&';
next_char(ls);
return TOK_AND;
case '|':
next_char(ls);
if (ls->current != '|') return '|';
next_char(ls);
return TOK_OR;
case '"': case '\'':
read_string(ls, tok);
return TOK_STRING;
@ -716,7 +762,7 @@ eo_lexer_token_to_str(int token, char *buf)
const char *
eo_lexer_keyword_str_get(int kw)
{
return tokens[kw + 13];
return tokens[kw + 11];
}
Eina_Bool

View File

@ -13,7 +13,7 @@
enum Tokens
{
TOK_EQ = START_CUSTOM, TOK_NQ, TOK_GT, TOK_LT, TOK_GE, TOK_LE,
TOK_EQ = START_CUSTOM, TOK_NQ, TOK_GE, TOK_LE,
TOK_AND, TOK_OR, TOK_LSH, TOK_RSH,
TOK_COMMENT, TOK_STRING, TOK_NUMBER, TOK_VALUE

View File

@ -250,8 +250,8 @@ get_binop_id(int tok)
case TOK_EQ: return EOLIAN_BINOP_EQ;
case TOK_NQ: return EOLIAN_BINOP_NQ;
case TOK_GT: return EOLIAN_BINOP_GT;
case TOK_LT: return EOLIAN_BINOP_LT;
case '>' : return EOLIAN_BINOP_GT;
case '<' : return EOLIAN_BINOP_LT;
case TOK_GE: return EOLIAN_BINOP_GE;
case TOK_LE: return EOLIAN_BINOP_LE;