stable
This commit is contained in:
		@ -1,8 +1,6 @@
 | 
			
		||||
 | 
			
		||||
#include "../ast.h"
 | 
			
		||||
#include "../parser.h"
 | 
			
		||||
#include "../symtab/symtab.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef BLOCK_MAX_NODE
 | 
			
		||||
#define BLOCK_MAX_NODE (1024)
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
#include "../ast.h"
 | 
			
		||||
#include "../parser.h"
 | 
			
		||||
#include "../symtab/symtab.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 0 false
 | 
			
		||||
@ -49,7 +48,10 @@ ast_node_t* parse_decl_val(parser_t* parser) {
 | 
			
		||||
    node->decl_val.type = type_node;
 | 
			
		||||
    node->decl_val.name = name_node;
 | 
			
		||||
    node->type = NT_DECL_VAR;
 | 
			
		||||
    symtab_add_symbol(parser->symtab, name_node->syms.tok.val.str, node, 0);
 | 
			
		||||
 | 
			
		||||
    type_node->syms.key.uid = parser->symtab->cur_scope->uid;
 | 
			
		||||
    type_node->syms.key.strp_name = name_node->syms.tok.val.str;
 | 
			
		||||
    symtab_add(parser->symtab, &type_node->syms.key, node);
 | 
			
		||||
    
 | 
			
		||||
    ttype = peek_tok_type(tokbuf);
 | 
			
		||||
    if (ttype == TOKEN_ASSIGN) {
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
#include "../ast.h"
 | 
			
		||||
#include "../parser.h"
 | 
			
		||||
#include "../symtab/symtab.h"
 | 
			
		||||
 | 
			
		||||
// Copy from `CParse`
 | 
			
		||||
/**
 | 
			
		||||
@ -253,11 +252,10 @@ static ast_node_t* parse_call(tok_stream_t* tokbuf, symtab_t *symtab, ast_node_t
 | 
			
		||||
    }
 | 
			
		||||
    pop_tok(tokbuf); // 跳过 ')'
 | 
			
		||||
 | 
			
		||||
    const char* name = ident->syms.tok.val.str;
 | 
			
		||||
    ast_node_t* sym = symtab_lookup_symbol(symtab, name);
 | 
			
		||||
    ast_node_t* sym = symtab_get(symtab, &ident->syms.key);
 | 
			
		||||
    // TODO check func is match
 | 
			
		||||
    if (sym == NULL || sym->type != NT_DECL_FUNC) {
 | 
			
		||||
        LOG_ERROR("function not decl %s", name);
 | 
			
		||||
        LOG_FATAL("function not decl %s", ident->syms.key.strp_name);
 | 
			
		||||
    }
 | 
			
		||||
    node->call.name = ident;
 | 
			
		||||
    node->call.func_decl = sym;
 | 
			
		||||
@ -345,10 +343,12 @@ static ast_node_t *parse_primary_expression(tok_stream_t* tokbuf, symtab_t *symt
 | 
			
		||||
    case TOKEN_IDENT:
 | 
			
		||||
        node = expect_pop_ident(tokbuf);
 | 
			
		||||
        cc_tktype_t ttype = peek_tok_type(tokbuf);
 | 
			
		||||
        node->syms.key.uid = 0;
 | 
			
		||||
        node->syms.key.strp_name = tok->val.str;
 | 
			
		||||
        if (ttype == TOKEN_L_PAREN) {
 | 
			
		||||
            node = parse_call(tokbuf, symtab, node);
 | 
			
		||||
        } else {
 | 
			
		||||
            void *sym = symtab_lookup_symbol(symtab, tok->val.str);
 | 
			
		||||
            void *sym = symtab_get(symtab, &node->syms.key);
 | 
			
		||||
            if (sym == NULL) {
 | 
			
		||||
                LOG_ERROR("undefined symbol but use %s", tok->val.str);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
#include "../ast.h"
 | 
			
		||||
#include "../parser.h"
 | 
			
		||||
#include "../symtab/symtab.h"
 | 
			
		||||
 | 
			
		||||
#ifndef FUNC_PARAM_CACHE_SIZE
 | 
			
		||||
#define FUNC_PARAM_CACHE_SIZE 32  // 合理初始值,可覆盖99%常见情况
 | 
			
		||||
@ -40,7 +39,10 @@ static void parse_params(parser_t* parser, tok_stream_t* cache, ast_node_t* node
 | 
			
		||||
            node->decl_val.expr_stmt = NULL;
 | 
			
		||||
            node->decl_val.data = NULL;
 | 
			
		||||
            vector_push(params->params.params, node);
 | 
			
		||||
            symtab_add_symbol(parser->symtab, id_node->syms.tok.val.str, node, 0);
 | 
			
		||||
 | 
			
		||||
            id_node->syms.key.uid = parser->symtab->cur_scope->uid;
 | 
			
		||||
            id_node->syms.key.strp_name = id_node->syms.tok.val.str;
 | 
			
		||||
            symtab_add(parser->symtab, &id_node->syms.key, node);
 | 
			
		||||
            break;
 | 
			
		||||
        case TOKEN_L_PAREN: {
 | 
			
		||||
            depth++;
 | 
			
		||||
@ -129,7 +131,11 @@ void parse_func(parser_t* parser) {
 | 
			
		||||
    
 | 
			
		||||
    ast_type_t type = check_is_func_decl(&(parser->tokbuf), &cache);
 | 
			
		||||
 | 
			
		||||
    ast_node_t* prev = symtab_add_symbol(parser->symtab, func_name, decl, 1);
 | 
			
		||||
 | 
			
		||||
    name_node->syms.key.uid = parser->symtab->cur_scope->uid;
 | 
			
		||||
    name_node->syms.key.strp_name = func_name;
 | 
			
		||||
    ast_node_t* prev = symtab_get(parser->symtab, &name_node->syms.key);
 | 
			
		||||
    // TODO Change something
 | 
			
		||||
    if (prev != NULL) {
 | 
			
		||||
        if (prev->type != NT_DECL_FUNC) {
 | 
			
		||||
            LOG_ERROR("the symbol duplicate old is %d, new is func", prev->type);
 | 
			
		||||
@ -143,6 +149,7 @@ void parse_func(parser_t* parser) {
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    symtab_add(parser->symtab, &name_node->syms.key, decl);
 | 
			
		||||
    vector_push(parser->root->root.children, decl);
 | 
			
		||||
    if (type == NT_DECL_FUNC) {
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user