Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ add_custom_command(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/y.tab.c
COMMAND yacc -d -o ${CMAKE_CURRENT_SOURCE_DIR}/y.tab.c ${CMAKE_CURRENT_SOURCE_DIR}/grammar.y
)
add_library(COMPILER lex.yy.c y.tab.c codegen.c disassemble.c create.c error.c fix_tree.c opcode.c string.c compiler.c)
add_library(COMPILER lex.yy.c y.tab.c codegen.c disassemble.c create.c error.c fix_tree.c opcode.c string.c compiler.c util.c)
target_include_directories(COMPILER INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
9 changes: 9 additions & 0 deletions compiler/create.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
#include "error.h"
#include "summoner.h"

static int current_line_number()
Expand Down Expand Up @@ -280,6 +281,14 @@ ParameterList *chain_parameter(ParameterList *list, ParameterList *parameter)

FuncDefinition *alloc_func_definition(char *name, ParameterList *parameters, TypeSpecifier *return_type, Block *block)
{
if (search_function(name) || search_declaration(name, NULL))
{
compile_error(get_current_compiler()->current_line_number,
FUNCTION_MULTIPLE_DEFINE_ERR,
STRING_MESSAGE_ARGUMENT, "name", name,
MESSAGE_ARGUMENT_END);
}

FuncDefinition *func_d = (FuncDefinition *)malloc(sizeof(FuncDefinition));
func_d->name = name;
func_d->parameters = parameters;
Expand Down
46 changes: 0 additions & 46 deletions compiler/fix_tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,52 +9,6 @@ extern BuiltinFun *search_builtin_function(char *name);
static Expression *fix_expression(Block *current_block, Expression *expr);
static void fix_statement_list(Block *current_block, StatementList *list, FuncDefinition *fd);

Declaration *search_declaration_in_current_block(char *identifier, Block *block)
{
if (!block)
{
return NULL;
}

Declaration *d_pos;
for (d_pos = block->declaration_list; d_pos; d_pos = d_pos->next)
{
if (!strcmp(identifier, d_pos->name))
{
return d_pos;
}
}
return NULL;
}

Declaration *search_declaration(char *identifier, Block *block)
{
Block *b_pos;
Declaration *d_pos;
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->name))
{
return d_pos;
}
}
}

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

static Expression *
fix_identifier_expression(Block *current_block, Expression *expr)
{
Expand Down
6 changes: 2 additions & 4 deletions compiler/grammar.y
Original file line number Diff line number Diff line change
Expand Up @@ -145,14 +145,12 @@ return_stmt:
;

if_stmt:
IF bool_expr block { $$ = alloc_if_stmt($2, $3, NULL, NULL); }
| IF bool_expr block ELSE block { $$ = alloc_if_stmt($2, $3, NULL, $5); }
| IF bool_expr block elseif_list { $$ = alloc_if_stmt($2, $3, $4, NULL); }
IF bool_expr block elseif_list { $$ = alloc_if_stmt($2, $3, $4, NULL); }
| IF bool_expr block elseif_list ELSE block { $$ = alloc_if_stmt($2, $3, $4, $6); }
;

elseif_list:
elseif
{ $$ = NULL; }
| elseif_list elseif { $$ = chain_else_if_list($1, $2); }
;

Expand Down
5 changes: 5 additions & 0 deletions compiler/summoner.h
Original file line number Diff line number Diff line change
Expand Up @@ -370,4 +370,9 @@ SVM_Executable *smc_code_gen(Compiler *compiler);
int svm_dump_instruction(FILE *fp, SVM_Byte *code, int index);
void svm_disassemble(SVM_Executable *exe);

/** util.c */
Declaration *search_declaration(char *identifier, Block *block);
Declaration *search_declaration_in_current_block(char *identifier, Block *block);
FuncDefinition *search_function(char *name);

#endif
62 changes: 62 additions & 0 deletions compiler/util.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <string.h>
#include "summoner.h"

Declaration *search_declaration_in_current_block(char *identifier, Block *block)
{
if (!block)
{
return NULL;
}

Declaration *d_pos;
for (d_pos = block->declaration_list; d_pos; d_pos = d_pos->next)
{
if (!strcmp(identifier, d_pos->name))
{
return d_pos;
}
}
return NULL;
}

Declaration *search_declaration(char *identifier, Block *block)
{
Block *b_pos;
Declaration *d_pos;
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->name))
{
return d_pos;
}
}
}

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

FuncDefinition *search_function(char *name)
{
Compiler *compiler;
FuncDefinition *func_pos;

compiler = get_current_compiler();
for (func_pos = compiler->func_definition_list; func_pos; func_pos = func_pos->next) {
if (!strcmp(func_pos->name, name)) {
return func_pos;
}
}
return NULL;
}