From 6ce7c051e853e631802aedd39cbffb14dc3f123c Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 25 Jul 2019 12:10:45 +1000 Subject: [PATCH] py/lexer: Reorder operator tokens to match corresponding binary ops. --- py/lexer.h | 58 ++++++++++++++++++++++++++++----------------------- py/parse.c | 12 +++++------ py/runtime0.h | 6 +++--- 3 files changed, 40 insertions(+), 36 deletions(-) diff --git a/py/lexer.h b/py/lexer.h index a29709107d..321185f10a 100644 --- a/py/lexer.h +++ b/py/lexer.h @@ -96,25 +96,43 @@ typedef enum _mp_token_kind_t { MP_TOKEN_KW_WITH, MP_TOKEN_KW_YIELD, + MP_TOKEN_OP_TILDE, + + // Order of these 6 matches corresponding mp_binary_op_t operator + MP_TOKEN_OP_LESS, + MP_TOKEN_OP_MORE, + MP_TOKEN_OP_DBL_EQUAL, + MP_TOKEN_OP_LESS_EQUAL, + MP_TOKEN_OP_MORE_EQUAL, + MP_TOKEN_OP_NOT_EQUAL, + + // Order of these 12 matches corresponding mp_binary_op_t operator + MP_TOKEN_OP_PIPE, + MP_TOKEN_OP_CARET, + MP_TOKEN_OP_AMPERSAND, + MP_TOKEN_OP_DBL_LESS, + MP_TOKEN_OP_DBL_MORE, MP_TOKEN_OP_PLUS, MP_TOKEN_OP_MINUS, MP_TOKEN_OP_STAR, - MP_TOKEN_OP_DBL_STAR, - MP_TOKEN_OP_SLASH, MP_TOKEN_OP_DBL_SLASH, + MP_TOKEN_OP_SLASH, MP_TOKEN_OP_PERCENT, - MP_TOKEN_OP_LESS, - MP_TOKEN_OP_DBL_LESS, - MP_TOKEN_OP_MORE, - MP_TOKEN_OP_DBL_MORE, - MP_TOKEN_OP_AMPERSAND, - MP_TOKEN_OP_PIPE, - MP_TOKEN_OP_CARET, - MP_TOKEN_OP_TILDE, - MP_TOKEN_OP_LESS_EQUAL, - MP_TOKEN_OP_MORE_EQUAL, - MP_TOKEN_OP_DBL_EQUAL, - MP_TOKEN_OP_NOT_EQUAL, + MP_TOKEN_OP_DBL_STAR, + + // Order of these 12 matches corresponding mp_binary_op_t operator + MP_TOKEN_DEL_PIPE_EQUAL, + MP_TOKEN_DEL_CARET_EQUAL, + MP_TOKEN_DEL_AMPERSAND_EQUAL, + MP_TOKEN_DEL_DBL_LESS_EQUAL, + MP_TOKEN_DEL_DBL_MORE_EQUAL, + MP_TOKEN_DEL_PLUS_EQUAL, + MP_TOKEN_DEL_MINUS_EQUAL, + MP_TOKEN_DEL_STAR_EQUAL, + MP_TOKEN_DEL_DBL_SLASH_EQUAL, + MP_TOKEN_DEL_SLASH_EQUAL, + MP_TOKEN_DEL_PERCENT_EQUAL, + MP_TOKEN_DEL_DBL_STAR_EQUAL, MP_TOKEN_DEL_PAREN_OPEN, MP_TOKEN_DEL_PAREN_CLOSE, @@ -128,18 +146,6 @@ typedef enum _mp_token_kind_t { MP_TOKEN_DEL_SEMICOLON, MP_TOKEN_DEL_AT, MP_TOKEN_DEL_EQUAL, - MP_TOKEN_DEL_PLUS_EQUAL, - MP_TOKEN_DEL_MINUS_EQUAL, - MP_TOKEN_DEL_STAR_EQUAL, - MP_TOKEN_DEL_SLASH_EQUAL, - MP_TOKEN_DEL_DBL_SLASH_EQUAL, - MP_TOKEN_DEL_PERCENT_EQUAL, - MP_TOKEN_DEL_AMPERSAND_EQUAL, - MP_TOKEN_DEL_PIPE_EQUAL, - MP_TOKEN_DEL_CARET_EQUAL, - MP_TOKEN_DEL_DBL_MORE_EQUAL, - MP_TOKEN_DEL_DBL_LESS_EQUAL, - MP_TOKEN_DEL_DBL_STAR_EQUAL, MP_TOKEN_DEL_MINUS_MORE, } mp_token_kind_t; diff --git a/py/parse.c b/py/parse.c index 66110e7c3d..946a3b1b34 100644 --- a/py/parse.c +++ b/py/parse.c @@ -645,19 +645,17 @@ STATIC bool fold_constants(parser_t *parser, uint8_t rule_id, size_t num_args) { } mp_token_kind_t tok = MP_PARSE_NODE_LEAF_ARG(peek_result(parser, i)); static const uint8_t token_to_op[] = { + MP_BINARY_OP_LSHIFT, + MP_BINARY_OP_RSHIFT, MP_BINARY_OP_ADD, MP_BINARY_OP_SUBTRACT, MP_BINARY_OP_MULTIPLY, - 255,//MP_BINARY_OP_POWER, - 255,//MP_BINARY_OP_TRUE_DIVIDE, MP_BINARY_OP_FLOOR_DIVIDE, + 255,//MP_BINARY_OP_TRUE_DIVIDE, MP_BINARY_OP_MODULO, - 255,//MP_BINARY_OP_LESS - MP_BINARY_OP_LSHIFT, - 255,//MP_BINARY_OP_MORE - MP_BINARY_OP_RSHIFT, + 255,//MP_BINARY_OP_POWER, }; - mp_binary_op_t op = token_to_op[tok - MP_TOKEN_OP_PLUS]; + mp_binary_op_t op = token_to_op[tok - MP_TOKEN_OP_DBL_LESS]; if (op == (mp_binary_op_t)255) { return false; } diff --git a/py/runtime0.h b/py/runtime0.h index efd439196c..e80e272aea 100644 --- a/py/runtime0.h +++ b/py/runtime0.h @@ -70,7 +70,7 @@ typedef enum { // Note: the first 9+12+12 of these are used in bytecode and changing // them requires changing the bytecode version. typedef enum { - // 9 relational operations, should return a bool + // 9 relational operations, should return a bool; order of first 6 matches corresponding mp_token_kind_t MP_BINARY_OP_LESS, MP_BINARY_OP_MORE, MP_BINARY_OP_EQUAL, @@ -81,7 +81,7 @@ typedef enum { MP_BINARY_OP_IS, MP_BINARY_OP_EXCEPTION_MATCH, - // 12 inplace arithmetic operations + // 12 inplace arithmetic operations; order matches corresponding mp_token_kind_t MP_BINARY_OP_INPLACE_OR, MP_BINARY_OP_INPLACE_XOR, MP_BINARY_OP_INPLACE_AND, @@ -95,7 +95,7 @@ typedef enum { MP_BINARY_OP_INPLACE_MODULO, MP_BINARY_OP_INPLACE_POWER, - // 12 normal arithmetic operations + // 12 normal arithmetic operations; order matches corresponding mp_token_kind_t MP_BINARY_OP_OR, MP_BINARY_OP_XOR, MP_BINARY_OP_AND,