X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=src%2Fparser_proc.y;h=32cba5d48daa207f3f669a438a5e062bee1e09bd;hb=3f3b862aeb06ebe0e61d8fcc21df0fe88e397688;hp=62e8011992d36fa3d6acb530a0b1e0f3002f7fa2;hpb=7474b3e23338ea03bcd65551959e2582cc455f9f;p=m6w6%2Fext-psi diff --git a/src/parser_proc.y b/src/parser_proc.y index 62e8011..32cba5d 100644 --- a/src/parser_proc.y +++ b/src/parser_proc.y @@ -15,7 +15,8 @@ %extra_argument {PSI_Parser *P} /* TOKEN is defined inside syntax_error */ %syntax_error { - PSI_ParserSyntaxError(P, P->fn, P->line, "Unexpected token '%s'", TOKEN->text); + PSI_ParserSyntaxError(P, P->psi.file.fn, P->line, "Unexpected token '%s'", TOKEN->text); + TOKEN->type = PSI_T_NAME; } %nonassoc NAME. @@ -28,10 +29,10 @@ blocks ::= blocks block. block ::= COMMENT. block ::= LIB(T) QUOTED_STRING(libname) EOS. { - if (P->lib) { - PSI_ParserSyntaxError(P, P->fn, T->line, "Extra 'lib %s' statement has no effect", libname->text); + if (P->psi.file.ln) { + PSI_ParserSyntaxError(P, P->psi.file.ln, T->line, "Extra 'lib %s' statement has no effect", libname->text); } else { - P->lib = strndup(libname->text + 1, libname->size - 2); + P->psi.file.ln = strndup(libname->text + 1, libname->size - 2); } free(libname); free(T); @@ -179,22 +180,6 @@ decl_type(type_) ::= VOID(T). { type_ = init_decl_type(T->type, T->text); free(T); } -decl_type(type_) ::= CHAR(T). { - type_ = init_decl_type(T->type, T->text); - free(T); -} -decl_type(type_) ::= SHORT(T). { - type_ = init_decl_type(T->type, T->text); - free(T); -} -decl_type(type_) ::= INT(T). { - type_ = init_decl_type(T->type, T->text); - free(T); -} -decl_type(type_) ::= LONG(T). { - type_ = init_decl_type(T->type, T->text); - free(T); -} decl_type(type_) ::= FLOAT(T). { type_ = init_decl_type(T->type, T->text); free(T); @@ -203,11 +188,12 @@ decl_type(type_) ::= DOUBLE(T). { type_ = init_decl_type(T->type, T->text); free(T); } -decl_type(type_) ::= SIZE_T(T). { - type_ = init_decl_type(T->type, T->text); +/* we have to support plain int here because we have it in our lexer rules */ +decl_type(type_) ::= INT(T). { + type_ = init_decl_type(PSI_T_NAME, T->text); free(T); } -decl_type(type_) ::= SINT8(T). { +decl_type(type_) ::= INT8(T). { type_ = init_decl_type(T->type, T->text); free(T); } @@ -215,7 +201,7 @@ decl_type(type_) ::= UINT8(T). { type_ = init_decl_type(T->type, T->text); free(T); } -decl_type(type_) ::= SINT16(T). { +decl_type(type_) ::= INT16(T). { type_ = init_decl_type(T->type, T->text); free(T); } @@ -223,7 +209,7 @@ decl_type(type_) ::= UINT16(T). { type_ = init_decl_type(T->type, T->text); free(T); } -decl_type(type_) ::= SINT32(T). { +decl_type(type_) ::= INT32(T). { type_ = init_decl_type(T->type, T->text); free(T); } @@ -231,7 +217,7 @@ decl_type(type_) ::= UINT32(T). { type_ = init_decl_type(T->type, T->text); free(T); } -decl_type(type_) ::= SINT64(T). { +decl_type(type_) ::= INT64(T). { type_ = init_decl_type(T->type, T->text); free(T); } @@ -269,23 +255,23 @@ impl_func(func) ::= FUNCTION REFERENCE NSNAME(NAME) impl_args(args) COLON impl_t %type impl_def_val {impl_def_val*} %destructor impl_def_val {free_impl_def_val($$);} impl_def_val(def) ::= NULL(T). { - def = init_impl_def_val(T); + def = init_impl_def_val(T->type, T->text); free(T); } impl_def_val(def) ::= NUMBER(T). { - def = init_impl_def_val(T); + def = init_impl_def_val(T->type, T->text); free(T); } impl_def_val(def) ::= TRUE(T). { - def = init_impl_def_val(T); + def = init_impl_def_val(T->type, T->text); free(T); } impl_def_val(def) ::= FALSE(T). { - def = init_impl_def_val(T); + def = init_impl_def_val(T->type, T->text); free(T); } impl_def_val(def) ::= QUOTED_STRING(T). { - def = init_impl_def_val(T); + def = init_impl_def_val(T->type, T->text); free(T); } @@ -423,6 +409,19 @@ set_stmt(set) ::= SET impl_var(var) EQUALS set_value(val) EOS. { set_value(val) ::= set_func(func) LPAREN decl_vars(vars) RPAREN. { val = init_set_value(func, vars); } +set_value(val) ::= set_func(func_) LPAREN decl_vars(vars_) COMMA set_vals(vals) RPAREN. { + val = vals; + val->func = func_; + val->vars = vars_; +} +%type set_vals {set_value*} +%destructor set_vals {free_set_value($$);} +set_vals(vals) ::= set_value(val). { + vals = add_inner_set_value(init_set_value(NULL, NULL), val); +} +set_vals(vals) ::= set_vals(vals_) COMMA set_value(val). { + vals = add_inner_set_value(vals_, val); +} %type set_func {set_func*} %destructor set_func {free_set_func($$);} @@ -453,14 +452,29 @@ set_func(func) ::= VOID(T). { %type return_stmt {return_stmt*} %destructor return_stmt {free_return_stmt($$);} -return_stmt(ret) ::= RETURN set_func(func) LPAREN decl_var(var) RPAREN EOS. { - ret = init_return_stmt(func, var); +return_stmt(ret) ::= RETURN set_value(val) EOS. { + ret = init_return_stmt(val); } %type free_stmt {free_stmt*} %destructor free_stmt {free_free_stmt($$);} -free_stmt(free) ::= FREE decl_vars(vars) EOS. { - free = init_free_stmt(vars); +free_stmt(free) ::= FREE free_calls(calls) EOS. { + free = init_free_stmt(calls); +} + +%type free_calls {free_calls*} +%destructor free_calls {free_free_calls($$);} +free_calls(calls) ::= free_call(call). { + calls = init_free_calls(call); +} +free_calls(calls) ::= free_calls(calls_) COMMA free_call(call). { + calls = add_free_call(calls_, call); +} + +%type free_call {free_call*} +%destructor free_call {free_free_call($$);} +free_call(call) ::= NAME(F) LPAREN decl_vars(vars) RPAREN. { + call = init_free_call(F->text, vars); } %type impl_type {impl_type*}