]> git.kaiwu.me - njs.git/commitdiff
Getting rid of lexer property and property_token.
authorhongzhidao <hongzhidao@gmail.com>
Thu, 20 Jun 2019 11:36:57 +0000 (07:36 -0400)
committerhongzhidao <hongzhidao@gmail.com>
Thu, 20 Jun 2019 11:36:57 +0000 (07:36 -0400)
njs/njs_lexer.c
njs/njs_lexer.h
njs/njs_lexer_keyword.c
njs/njs_parser.c
njs/njs_parser.h
njs/njs_parser_expression.c
njs/njs_parser_terminal.c

index c1b3d55128b1c3fe9d67daa854419b59e1a029d9..a05c9a45d1442521f2c7208c211d794458bffcc1 100644 (file)
@@ -420,11 +420,6 @@ njs_lexer_token_name_resolve(njs_lexer_t *lexer, njs_lexer_token_t *lt)
 {
     if (lt->token == NJS_TOKEN_NAME) {
         njs_lexer_keyword(lexer, lt);
-
-        if (lexer->property) {
-            lexer->property_token = lt->token;
-            lt->token = NJS_TOKEN_NAME;
-        }
     }
 
     return lt->token;
index 159952af38ef8225702629c8b85ee2b3fe2b14e9..a79a582722195de6d53e80163692fb6b1aaaef44 100644 (file)
@@ -231,13 +231,11 @@ typedef struct {
 typedef struct {
     njs_lexer_token_t               *lexer_token;
     nxt_queue_t                     preread; /*  of njs_lexer_token_t */
+    uint8_t                         keyword;
 
     u_char                          *prev_start;
     njs_token_t                     prev_token:16;
 
-    uint8_t                         property;      /* 1 bit */
-    njs_token_t                     property_token:16;
-
     uint32_t                        line;
     nxt_str_t                       file;
 
index 0a827574e25940fef8e56008f50028fc0edda9bc..afe225f2b7d6241c78205d655a97e6bc190a249d 100644 (file)
@@ -191,5 +191,6 @@ njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt)
         keyword = lhq.value;
         lt->token = keyword->token;
         lt->number = keyword->number;
+        lexer->keyword = 1;
     }
 }
index 3ad9f551fcfbdd62e1f263c6c4298c57fd2a25d5..1a05dec10fa560edf14824343c57d9eec85ef51e 100644 (file)
@@ -2064,37 +2064,6 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser)
 }
 
 
-njs_token_t
-njs_parser_property_token(njs_vm_t *vm, njs_parser_t *parser)
-{
-    nxt_int_t          ret;
-    njs_token_t        token;
-    njs_parser_node_t  *node;
-
-    parser->lexer->property = 1;
-
-    token = njs_parser_token(vm, parser);
-
-    parser->lexer->property = 0;
-
-    if (token == NJS_TOKEN_NAME) {
-        node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING);
-        if (nxt_slow_path(node == NULL)) {
-            return NJS_TOKEN_ERROR;
-        }
-
-        ret = njs_parser_string_create(vm, &node->u.value);
-        if (nxt_slow_path(ret != NXT_OK)) {
-            return NJS_TOKEN_ERROR;
-        }
-
-        parser->node = node;
-    }
-
-    return token;
-}
-
-
 nxt_int_t
 njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
index 1a8de71877c5bdf504b66fd1bd37cfc6c5db2f28..b4677a8b46014addabdad201255febe31757f080 100644 (file)
@@ -94,7 +94,6 @@ njs_token_t njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *parent);
 njs_parser_node_t *njs_parser_argument(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *expr, njs_index_t index);
-njs_token_t njs_parser_property_token(njs_vm_t *vm, njs_parser_t *parser);
 nxt_int_t njs_parser_string_create(njs_vm_t *vm, njs_value_t *value);
 njs_token_t njs_parser_lambda_statements(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
@@ -187,6 +186,26 @@ njs_parser_node_new(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 }
 
 
+nxt_inline njs_parser_node_t *
+njs_parser_node_string(njs_vm_t *vm, njs_parser_t *parser)
+{
+    nxt_int_t          ret;
+    njs_parser_node_t  *node;
+
+    node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING);
+    if (nxt_slow_path(node == NULL)) {
+        return NULL;
+    }
+
+    ret = njs_parser_string_create(vm, &node->u.value);
+    if (nxt_slow_path(ret != NXT_OK)) {
+        return NULL;
+    }
+
+    return node;
+}
+
+
 nxt_inline njs_token_t
 njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
     njs_token_t match)
index 95ab481c3786448a25b4d07df10b5eccdba86f62..f7e629a6b4180bd7d155bf471bc0630b0790b2be 100644 (file)
@@ -884,7 +884,7 @@ static njs_token_t
 njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
-    njs_parser_node_t  *node;
+    njs_parser_node_t  *node, *prop_node;
 
     for ( ;; ) {
         if (token != NJS_TOKEN_DOT
@@ -902,17 +902,21 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
         node->left = parser->node;
 
         if (token == NJS_TOKEN_DOT) {
+            token = njs_parser_token(vm, parser);
 
-            token = njs_parser_property_token(vm, parser);
-            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-                return token;
+            if (token != NJS_TOKEN_NAME && !parser->lexer->keyword) {
+                return NJS_TOKEN_ILLEGAL;
             }
 
-            if (token != NJS_TOKEN_NAME) {
-                return NJS_TOKEN_ILLEGAL;
+            prop_node = njs_parser_node_string(vm, parser);
+            if (nxt_slow_path(prop_node == NULL)) {
+                return NJS_TOKEN_ERROR;
             }
 
             token = njs_parser_token(vm, parser);
+            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                return token;
+            }
 
         } else {
             token = njs_parser_token(vm, parser);
@@ -921,13 +925,14 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
             }
 
             token = njs_parser_property_brackets(vm, parser, token);
-        }
+            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                return token;
+            }
 
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-            return token;
+            prop_node = parser->node;
         }
 
-        node->right = parser->node;
+        node->right = prop_node;
         parser->node = node;
     }
 }
index c5ef19127392dc09b543078552fdfe4688a71679..7baaec6d53928bd4f9eab5c57d95e8fab558c2b1 100644 (file)
@@ -488,7 +488,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
     uint32_t           hash, token_line;
     nxt_int_t          ret;
     nxt_str_t          name;
-    njs_token_t        token;
+    njs_token_t        token, prop_token;
     njs_lexer_t        *lexer;
     njs_parser_node_t  *object, *property, *expression;
 
@@ -506,54 +506,69 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
     object->u.object = obj;
 
     for ( ;; ) {
-        token = njs_parser_property_token(vm, parser);
-
-        if (token == NJS_TOKEN_CLOSE_BRACE) {
-            break;
+        prop_token = njs_parser_token(vm, parser);
+        if (nxt_slow_path(prop_token <= NJS_TOKEN_ILLEGAL)) {
+            return prop_token;
         }
 
-        name.start = NULL;
+        nxt_memzero(&name, sizeof(nxt_str_t));
 
-        switch (token) {
-
-        case NJS_TOKEN_NAME:
-            name = *njs_parser_text(parser);
+        switch (prop_token) {
 
-            hash = njs_parser_key_hash(parser);
-            token_line = njs_parser_token_line(parser);
-
-            token = njs_parser_token(vm, parser);
-            break;
+        case NJS_TOKEN_CLOSE_BRACE:
+            goto done;
 
         case NJS_TOKEN_NUMBER:
         case NJS_TOKEN_STRING:
         case NJS_TOKEN_ESCAPE_STRING:
-            token = njs_parser_terminal(vm, parser, token);
+            token = njs_parser_terminal(vm, parser, prop_token);
+            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                return token;
+            }
+
+            property = parser->node;
             break;
 
         default:
-            return NJS_TOKEN_ILLEGAL;
-        }
+            if (prop_token != NJS_TOKEN_NAME && !lexer->keyword) {
+                return NJS_TOKEN_ILLEGAL;
+            }
 
-        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-            return token;
+            property = njs_parser_node_string(vm, parser);
+            if (nxt_slow_path(property == NULL)) {
+                return NJS_TOKEN_ERROR;
+            }
+
+            name = *njs_parser_text(parser);
+            hash = njs_parser_key_hash(parser);
+            token_line = njs_parser_token_line(parser);
+
+            token = njs_parser_token(vm, parser);
+            break;
         }
 
-        property = parser->node;
+        switch (token) {
+
+        case NJS_TOKEN_COMMA:
+        case NJS_TOKEN_CLOSE_BRACE:
+
+            if (name.length == 0
+                || prop_token == NJS_TOKEN_THIS
+                || prop_token == NJS_TOKEN_GLOBAL_THIS)
+            {
+                return NJS_TOKEN_ILLEGAL;
+            }
 
-        if (name.start != NULL
-            && (token == NJS_TOKEN_COMMA || token == NJS_TOKEN_CLOSE_BRACE)
-            && lexer->property_token != NJS_TOKEN_THIS
-            && lexer->property_token != NJS_TOKEN_GLOBAL_THIS)
-        {
-            expression = njs_parser_reference(vm, parser, lexer->property_token,
-                                              &name, hash, token_line);
+            expression = njs_parser_reference(vm, parser, prop_token, &name,
+                                              hash, token_line);
             if (nxt_slow_path(expression == NULL)) {
                 return NJS_TOKEN_ERROR;
             }
 
-        } else {
-            token = njs_parser_match(vm, parser, token, NJS_TOKEN_COLON);
+            break;
+
+        case NJS_TOKEN_COLON:
+            token = njs_parser_token(vm, parser);
             if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
                 return token;
             }
@@ -564,6 +579,10 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
             }
 
             expression = parser->node;
+            break;
+
+        default:
+            return NJS_TOKEN_ILLEGAL;
         }
 
         ret = njs_parser_object_property(vm, parser, obj, property, expression);
@@ -580,6 +599,8 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
         }
     }
 
+done:
+
     parser->node = obj;
 
     return njs_parser_token(vm, parser);