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[] = static const char * const tokens[] =
{ {
"==", "!=", ">", "<", ">=", "<=", "&&", "||", "<<", ">>", "==", "!=", ">=", "<=", "&&", "||", "<<", ">>",
"<comment>", "<string>", "<number>", "<value>", "<comment>", "<string>", "<number>", "<value>",
@ -106,7 +106,7 @@ init_hash(void)
unsigned int i, u; unsigned int i, u;
if (keyword_map) return; if (keyword_map) return;
keyword_map = eina_hash_string_superfast_new(NULL); 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)); 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; continue;
case '\0': case '\0':
return -1; 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 '\'': case '"': case '\'':
read_string(ls, tok); read_string(ls, tok);
return TOK_STRING; return TOK_STRING;
@ -716,7 +762,7 @@ eo_lexer_token_to_str(int token, char *buf)
const char * const char *
eo_lexer_keyword_str_get(int kw) eo_lexer_keyword_str_get(int kw)
{ {
return tokens[kw + 13]; return tokens[kw + 11];
} }
Eina_Bool Eina_Bool

View File

@ -13,7 +13,7 @@
enum Tokens 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_AND, TOK_OR, TOK_LSH, TOK_RSH,
TOK_COMMENT, TOK_STRING, TOK_NUMBER, TOK_VALUE 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_EQ: return EOLIAN_BINOP_EQ;
case TOK_NQ: return EOLIAN_BINOP_NQ; case TOK_NQ: return EOLIAN_BINOP_NQ;
case TOK_GT: return EOLIAN_BINOP_GT; case '>' : return EOLIAN_BINOP_GT;
case TOK_LT: return EOLIAN_BINOP_LT; case '<' : return EOLIAN_BINOP_LT;
case TOK_GE: return EOLIAN_BINOP_GE; case TOK_GE: return EOLIAN_BINOP_GE;
case TOK_LE: return EOLIAN_BINOP_LE; case TOK_LE: return EOLIAN_BINOP_LE;