Example #1
0
File: util.c Project: 3man/devlang
Declaration *
dkc_search_declaration(char *identifier, Block *block)
{
    Block *b_pos;
    DeclarationList *d_pos;
    DKC_Compiler *compiler;

    for (b_pos = block; b_pos; b_pos = b_pos->outer_block) {
        for (d_pos = b_pos->declaration_list; d_pos; d_pos = d_pos->next) {
            if (!strcmp(identifier, d_pos->declaration->name)) {
                return d_pos->declaration;
            }
        }
    }

    compiler = dkc_get_current_compiler();

    for (d_pos = compiler->declaration_list; d_pos; d_pos = d_pos->next) {
        if (!strcmp(identifier, d_pos->declaration->name)) {
            return d_pos->declaration;
        }
    }

    return NULL;
}
Example #2
0
DKC_Compiler *
DKC_create_compiler(void)
{
    MEM_Storage storage;
    DKC_Compiler *compiler;
    DKC_Compiler *compiler_backup;

    compiler_backup = dkc_get_current_compiler();

    storage = MEM_open_storage(0);
    compiler = MEM_storage_malloc(storage,
                                  sizeof(struct DKC_Compiler_tag));
    dkc_set_current_compiler(compiler);
    compiler->compile_storage = storage;
    compiler->package_name = NULL;
    compiler->source_suffix = DKM_SOURCE;
    compiler->require_list = NULL;
    compiler->rename_list = NULL;
    compiler->function_list = NULL;
    compiler->dvm_function_count = 0;
    compiler->dvm_function = NULL;
    compiler->dvm_class_count = 0;
    compiler->dvm_class = NULL;
    compiler->declaration_list = NULL;
    compiler->statement_list = NULL;
    compiler->class_definition_list = NULL;
    compiler->current_block = NULL;
    compiler->current_line_number = 1;
    compiler->current_class_definition = NULL;
    compiler->current_catch_clause = NULL;
    compiler->input_mode = FILE_INPUT_MODE;
    compiler->required_list = NULL;
    compiler->array_method_count = ARRAY_SIZE(st_array_method);
    compiler->array_method
        = create_built_in_method(st_array_method,
                                 ARRAY_SIZE(st_array_method));
    compiler->string_method_count = ARRAY_SIZE(st_string_method);
    compiler->string_method
        = create_built_in_method(st_string_method,
                                 ARRAY_SIZE(st_string_method));

#ifdef EUC_SOURCE
    compiler->source_encoding = EUC_ENCODING;
#else
#ifdef SHIFT_JIS_SOURCE
    compiler->source_encoding = SHIFT_JIS_ENCODING;
#else
#ifdef UTF_8_SOURCE
    compiler->source_encoding = UTF_8_ENCODING;
#else
    DBG_panic(("source encoding is not defined.\n"));
#endif
#endif
#endif

    dkc_set_current_compiler(compiler_backup);

    return compiler;
}
Example #3
0
int
yyerror(char const *str)
{
    dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                      PARSE_ERR,
                      STRING_MESSAGE_ARGUMENT, "token", yytext,
                      MESSAGE_ARGUMENT_END);

    return 0;
}
Example #4
0
File: util.c Project: 3man/devlang
void *
dkc_malloc(size_t size)
{
    void *p;
    DKC_Compiler *compiler;

    compiler = dkc_get_current_compiler();
    p = MEM_storage_malloc(compiler->compile_storage, size);

    return p;
}
Example #5
0
File: util.c Project: 3man/devlang
char *
dkc_strdup(char *src)
{
    char *p;
    DKC_Compiler *compiler;

    compiler = dkc_get_current_compiler();
    p = MEM_storage_malloc(compiler->compile_storage, strlen(src)+1);
    strcpy(p, src);

    return p;
}
Example #6
0
int
dkc_close_character_literal(void)
{
    DVM_Char buf[16];
    int new_str_len;

    dkc_add_string_literal('\0');
    new_str_len = dvm_mbstowcs_len(st_string_literal_buffer);
    if (new_str_len < 0) {
        dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                          BAD_MULTIBYTE_CHARACTER_ERR,
                          MESSAGE_ARGUMENT_END);
    } else if (new_str_len > 1) {
        dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                          TOO_LONG_CHARACTER_LITERAL_ERR,
                          MESSAGE_ARGUMENT_END);
    }
    
    dvm_mbstowcs(st_string_literal_buffer, buf);

    return buf[0];
}
Example #7
0
DVM_Char *
dkc_close_string_literal(void)
{
    DVM_Char *new_str;
    int new_str_len;

    dkc_add_string_literal('\0');
    new_str_len = dvm_mbstowcs_len(st_string_literal_buffer);
    if (new_str_len < 0) {
        dkc_compile_error(dkc_get_current_compiler()->current_line_number,
                          BAD_MULTIBYTE_CHARACTER_ERR,
                          MESSAGE_ARGUMENT_END);
    }
    new_str = MEM_malloc(sizeof(DVM_Char) * (new_str_len+1));
    dvm_mbstowcs(st_string_literal_buffer, new_str);

    return new_str;
}
Example #8
0
void
dkc_compile_error(int line_number, CompileError id, ...)
{
    va_list     ap;
    VWString    message;

    self_check();
    va_start(ap, id);

    dkc_vwstr_clear(&message);
    format_message(line_number,
                   &dkc_error_message_format[id],
                   &message, ap);
    fprintf(stderr, "%s:%3d:", dkc_get_current_compiler()->path,
            line_number);
    dvm_print_wcs_ln(stderr, message.string);
    va_end(ap);

    exit(1);
}
Example #9
0
File: util.c Project: 3man/devlang
FunctionDefinition *
dkc_search_function(char *name)
{
    DKC_Compiler *compiler;
    RenameList *ren_pos;
    CompilerList *comp_pos;
    FunctionDefinition *func_pos;

    compiler = dkc_get_current_compiler();

    for (func_pos = compiler->function_list; func_pos;
         func_pos = func_pos->next) {
        if (!strcmp(func_pos->name, name)
            && func_pos->class_definition == NULL) {
            return func_pos;
        }
    }

    for (ren_pos = compiler->rename_list; ren_pos; ren_pos = ren_pos->next) {
        if (!strcmp(ren_pos->renamed_name, name)) {
            FunctionDefinition * fd
                = search_renamed_function(compiler, ren_pos);
            if (fd) {
                return fd;
            }
        }
    }

    for (comp_pos = compiler->required_list; comp_pos;
         comp_pos = comp_pos->next) {
        for (func_pos = comp_pos->compiler->function_list; func_pos;
             func_pos = func_pos->next) {
            if (!strcmp(func_pos->name, name)
                && func_pos->class_definition == NULL) {
                return func_pos;
            }
        }
    }

    return NULL;
}
Example #10
0
File: util.c Project: 3man/devlang
ClassDefinition *
dkc_search_class(char *identifier)
{
    DKC_Compiler *compiler;
    RenameList *ren_pos;
    CompilerList *comp_pos;
    ClassDefinition *class_def;

    compiler = dkc_get_current_compiler();
    for (class_def = compiler->class_definition_list;
         class_def; class_def = class_def->next) {
        if (!strcmp(class_def->name, identifier)) {
            return class_def;
        }
    }

    for (ren_pos = compiler->rename_list; ren_pos; ren_pos = ren_pos->next) {
        if (!strcmp(ren_pos->renamed_name, identifier)) {
            class_def = search_renamed_class(compiler, ren_pos);
            if (class_def) {
                return class_def;
            }
        }
    }

    for (comp_pos = compiler->required_list; comp_pos;
         comp_pos = comp_pos->next) {
        for (class_def = comp_pos->compiler->class_definition_list;
             class_def; class_def = class_def->next) {
            if (!strcmp(class_def->name, identifier)) {
                return class_def;
            }
        }
    }

    return NULL;
}
Example #11
0
static DVM_Executable *
do_compile(DKC_Compiler *compiler, DVM_ExecutableList *list,
           char *path, DVM_Boolean is_required)
{
    extern FILE *yyin;
    extern int yyparse(void);
    RequireList *req_pos;
    DKC_Compiler *req_comp;
    DVM_Executable *exe;
    DVM_Executable *req_exe;
    char found_path[FILENAME_MAX];
    DKC_Compiler *compiler_backup;
    SourceInput source_input;

    compiler_backup = dkc_get_current_compiler();
    dkc_set_current_compiler(compiler);
    if (yyparse()) {
        fprintf(stderr, "Error ! Error ! Error !\n");
        exit(1);
    }

    for (req_pos = compiler->require_list; req_pos;
         req_pos = req_pos->next) {
        req_comp = search_compiler(st_compiler_list, req_pos->package_name);
        if (req_comp) {
            compiler->required_list
                = add_compiler_to_list(compiler->required_list, req_comp);
            continue;
        }
        req_comp = DKC_create_compiler();
        
        /* BUGBUG req_comp references parent compiler's MEM_storage */
        req_comp->package_name = req_pos->package_name;
        req_comp->source_suffix = DKH_SOURCE;

        compiler->required_list
            = add_compiler_to_list(compiler->required_list, req_comp);
        st_compiler_list = add_compiler_to_list(st_compiler_list, req_comp);

        get_require_input(req_pos, found_path, &source_input);
        set_path_to_compiler(req_comp, found_path);
        req_comp->input_mode = source_input.input_mode;
        if (source_input.input_mode == FILE_INPUT_MODE) {
            yyin = source_input.u.file.fp;
        } else {
            dkc_set_source_string(source_input.u.string.lines);
        }
        req_exe = do_compile(req_comp, list, found_path, DVM_TRUE);
    }

    dkc_fix_tree(compiler);
    exe = dkc_generate(compiler);
    if (path) {
        exe->path = MEM_strdup(path);
    } else {
        exe->path = NULL;
    }
    /* dvm_disassemble(exe);*/

    exe->is_required = is_required;
    if (!add_exe_to_list(exe, list)) {
        dvm_dispose_executable(exe);
    }

    dkc_set_current_compiler(compiler_backup);

    return exe;
}