X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser_proc.y;h=a189a885081ccf54fafed87e1813bb9fd5082847;hb=d9a7378b795f32b91e110bd163c019aa30e79084;hp=2fb309ea0c983cce74587517bf28eef72d28e7a8;hpb=469fe3395cb9696e32bcd64639f22113d8fb2ec6;p=m6w6%2Fext-psi diff --git a/src/parser_proc.y b/src/parser_proc.y index 2fb309e..a189a88 100644 --- a/src/parser_proc.y +++ b/src/parser_proc.y @@ -15,7 +15,7 @@ %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); } %nonassoc NAME. @@ -28,10 +28,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); @@ -408,6 +408,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($$);} @@ -438,8 +451,8 @@ 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*}