fix memleaks
[m6w6/ext-psi] / src / parser_proc.y
index 99054b671fc61223fa5f101c5fa54c538f13ba2c..c5eecbaf9a044b9f04426589a2dd1d2939e39a39 100644 (file)
@@ -15,7 +15,7 @@
 %extra_argument {PSI_Parser *P}
 /* TOKEN is defined inside syntax_error */
 %syntax_error {
-       if (TOKEN) {
+       if (TOKEN && TOKEN->type != PSI_T_EOF) {
                PSI_ParserSyntaxError(P, P->psi.file.fn, P->line, "Unexpected token '%s'", TOKEN->text);
        } else {
                PSI_ParserSyntaxError(P, P->psi.file.fn, P->line, "Unexpected end of input");
 }
 
 %nonassoc NAME.
-%fallback NAME FREE SET LET RETURN LIB INT.
+%left PLUS MINUS.
+%left SLASH ASTERISK.
+%fallback NAME TEMP FREE SET LET RETURN LIB INT UNSIGNED.
 
 file ::= blocks.
 
 blocks ::= block.
 blocks ::= blocks block.
 
+block ::= EOF.
+
 block ::= LIB(T) QUOTED_STRING(libname) EOS. {
        if (P->psi.file.ln) {
                PSI_ParserSyntaxError(P, P->psi.file.ln, T->line, "Extra 'lib %s' statement has no effect", libname->text);
@@ -271,7 +275,7 @@ impl_func(func) ::= FUNCTION NSNAME(NAME) impl_args(args) COLON impl_type(type).
        func = init_impl_func(NAME->text, args, type, 0);
        free(NAME);
 }
-impl_func(func) ::= FUNCTION REFERENCE NSNAME(NAME) impl_args(args) COLON impl_type(type). {
+impl_func(func) ::= FUNCTION AMPERSAND NSNAME(NAME) impl_args(args) COLON impl_type(type). {
        func = init_impl_func(NAME->text, args, type, 1);
        free(NAME);
 }
@@ -290,7 +294,7 @@ impl_var(var) ::= DOLLAR NAME(T). {
        var = init_impl_var(T->text, 0);
        free(T);
 }
-impl_var(var) ::= REFERENCE DOLLAR NAME(T). {
+impl_var(var) ::= AMPERSAND DOLLAR NAME(T). {
        var = init_impl_var(T->text, 1);
        free(T);
 }
@@ -345,43 +349,85 @@ impl_stmt(stmt) ::= free_stmt(free). {
        stmt = init_impl_stmt(PSI_T_FREE, free);
 }
 
+%token_class num_exp_token NUMBER NSNAME.
+%token_class num_exp_op_token PLUS MINUS ASTERISK SLASH.
+%type num_exp {num_exp*}
+%destructor num_exp {free_num_exp($$);}
+num_exp(exp) ::= num_exp_token(tok). {
+       exp = init_num_exp(tok->type, tok->text);
+       free(tok);
+}
+num_exp(exp) ::= decl_var(var). {
+       exp = init_num_exp(PSI_T_NAME, var);
+}
+num_exp(exp) ::= num_exp(exp_) num_exp_op_token(operator_) num_exp(operand_). {
+       exp_->operator = operator_->type;
+       exp_->operand = operand_;
+       exp = exp_;
+       free(operator_);
+}
+
 %type let_stmt {let_stmt*}
 %destructor let_stmt {free_let_stmt($$);}
 let_stmt(let) ::= LET decl_var(var) EOS. {
-       let = init_let_stmt(var, NULL);
-}
-let_stmt(let) ::= LET decl_var(var) EQUALS let_value(val) EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_NULL, NULL));
+}/*
+let_stmt(let) ::= LET decl_var(var) EQUALS let_val(val) EOS. {
        let = init_let_stmt(var, val);
+}*/
+let_stmt(let) ::= LET decl_var(var) EQUALS reference(r) let_val(val) EOS. {
+       val->flags.one.is_reference = r ? 1 : 0;
+       let = init_let_stmt(var, val);
+}
+let_stmt(let) ::= TEMP decl_var(var) EQUALS decl_var(val) EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_TMP, val));
 }
 
-%type let_value {let_value*}
-%destructor let_value {free_let_value($$);}
-let_value(val) ::= CALLOC(F) LPAREN NUMBER(N) COMMA decl_type(t) RPAREN. {
-       val = init_let_value(
-               init_let_func(F->type, F->text,
-                       init_let_calloc(
-                               atol(N->text), t
-                       )
-               ), NULL, 0
-       );
-       free(F);
-       free(N);
+%type let_val {let_val*}
+%destructor let_val {free_let_val($$);}
+let_val(val) ::= NULL. {
+       val = init_let_val(PSI_LET_NULL, NULL);
 }
-let_value(val) ::= reference(r) let_func(func) LPAREN impl_var(var) RPAREN. {
-       val = init_let_value(func, var, r);
+let_val(val) ::= num_exp(exp). {
+       val = init_let_val(PSI_LET_NUMEXP, exp);
 }
-let_value(val) ::= reference(r) NULL. {
-       val = init_let_value(NULL, NULL, r);
+let_val(val) ::= CALLOC LPAREN let_calloc(alloc) RPAREN. {
+       val = init_let_val(PSI_LET_CALLOC, alloc);
 }
-
-%token_class let_func_token ARRVAL STRLEN STRVAL FLOATVAL INTVAL BOOLVAL.
+let_val(val) ::= let_func(func). {
+       val = init_let_val(PSI_LET_FUNC, func);
+}
+/*
+let_stmt(let) ::= LET decl_var(var) EQUALS reference(r) NULL EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_NULL, NULL, r?PSI_LET_REFERENCE:0));
+}
+let_stmt(let) ::= LET decl_var(var) EQUALS reference(r) num_exp(exp) EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_NUMEXP, exp, r?PSI_LET_REFERENCE:0));
+}
+let_stmt(let) ::= LET decl_var(var) EQUALS reference(r) CALLOC LPAREN let_calloc(alloc) RPAREN EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_CALLOC, alloc, r?PSI_LET_REFERENCE:0));
+}
+let_stmt(let) ::= LET decl_var(var) EQUALS reference(r) let_func(func) EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_FUNC, func, r?PSI_LET_REFERENCE:0));
+}
+let_stmt(let) ::= LET decl_var(var) EQUALS decl_var(val) EOS. {
+       let = init_let_stmt(var, init_let_val(PSI_LET_VAR, val, 0));
+}
+*/
+%type let_calloc {let_calloc*}
+%destructor let_calloc {free_let_calloc($$);}
+let_calloc(alloc) ::= num_exp(nmemb) COMMA num_exp(size). {
+       alloc = init_let_calloc(nmemb, size);
+}
+%token_class let_func_token OBJVAL ARRVAL PATHVAL STRLEN STRVAL FLOATVAL INTVAL BOOLVAL.
 %type let_func {let_func*}
 %destructor let_func {free_let_func($$);}
-let_func(func) ::= let_func_token(T). {
-       func = init_let_func(T->type, T->text, NULL);
+let_func(func) ::= let_func_token(T) LPAREN impl_var(var) RPAREN. {
+       func = init_let_func(T->type, T->text, var);
        free(T);
 }
 
+
 %type set_stmt {set_stmt*}
 %destructor set_stmt {free_set_stmt($$);}
 set_stmt(set) ::= SET impl_var(var) EQUALS set_value(val) EOS. {
@@ -390,13 +436,23 @@ set_stmt(set) ::= SET impl_var(var) EQUALS set_value(val) EOS. {
 
 %type set_value {set_value*}
 %destructor set_value {free_set_value($$);}
-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_var(var) RPAREN. {
+       val = init_set_value(func, init_decl_vars(var));
+}
+set_value(val) ::= set_func(func) LPAREN decl_var(var) COMMA num_exp(num_) RPAREN. {
+       val = init_set_value(func, init_decl_vars(var));
+       val->num = num_;
+}
+set_value(val) ::= set_func(func_) LPAREN decl_var(var) COMMA set_vals(vals) RPAREN. {
+       val = vals;
+       val->func = func_;
+       val->vars = init_decl_vars(var);
 }
-set_value(val) ::= set_func(func_) LPAREN decl_vars(vars_) COMMA set_vals(vals) RPAREN. {
+set_value(val) ::= set_func(func_) LPAREN decl_var(var) COMMA num_exp(num_) COMMA set_vals(vals) RPAREN. {
        val = vals;
        val->func = func_;
-       val->vars = vars_;
+       val->num = num_;
+       val->vars = init_decl_vars(var);
 }
 %type set_vals {set_value*}
 %destructor set_vals {free_set_value($$);}
@@ -407,7 +463,7 @@ set_vals(vals) ::= set_vals(vals_) COMMA set_value(val). {
        vals = add_inner_set_value(vals_, val);
 }
 
-%token_class set_func_token TO_ARRAY TO_STRING TO_INT TO_FLOAT TO_BOOL VOID.
+%token_class set_func_token TO_OBJECT TO_ARRAY TO_STRING TO_INT TO_FLOAT TO_BOOL VOID.
 %type set_func {set_func*}
 %destructor set_func {free_set_func($$);}
 set_func(func) ::= set_func_token(T). {
@@ -442,7 +498,7 @@ free_call(call) ::= NAME(F) LPAREN decl_vars(vars) RPAREN. {
        call = init_free_call(F->text, vars);
 }
 
-%token_class impl_type_token VOID MIXED BOOL INT FLOAT STRING ARRAY.
+%token_class impl_type_token VOID MIXED BOOL INT FLOAT STRING ARRAY OBJECT.
 %type impl_type {impl_type*}
 %destructor impl_type {free_impl_type($$);}
 impl_type(type_) ::= impl_type_token(T). {
@@ -452,12 +508,12 @@ impl_type(type_) ::= impl_type_token(T). {
 
 %type reference {char}
 reference(r) ::= . {r = 0;}
-reference(r) ::= REFERENCE. {r = 1;}
+reference(r) ::= AMPERSAND. {r = 1;}
 
 %type indirection {unsigned}
 indirection(i) ::= . {i = 0;}
 indirection(i) ::= pointers(p). {i = p;}
 
 %type pointers {unsigned}
-pointers(p) ::= POINTER. {p = 1;}
-pointers(p) ::= pointers(P) POINTER. {p = P+1;}
+pointers(p) ::= ASTERISK. {p = 1;}
+pointers(p) ::= pointers(P) ASTERISK. {p = P+1;}