forked from enlightenment/efl
eolian: lexing of multichar binary operators
This commit is contained in:
parent
62541ce484
commit
96f360a7d1
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue