Added negative numbers.
This commit is contained in:
parent
905acacd07
commit
e3afe52ab7
@ -32,6 +32,11 @@ ASTNumData exec_call(AST* ast) {
|
||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
||||
|
||||
return n1 + n2;
|
||||
} else if (!strcmp(calldata->to, "-") && calldata->argc == 2) {
|
||||
ASTNumData n1 = exec_expr(calldata->argv[0]);
|
||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
||||
|
||||
return n1 - n2;
|
||||
}
|
||||
return -1000;
|
||||
}
|
||||
|
@ -22,6 +22,7 @@
|
||||
%define parse.error verbose
|
||||
|
||||
%token<fval> NUM
|
||||
%token NEG
|
||||
%token<strval> CALL
|
||||
%token PLUS
|
||||
%token NL
|
||||
@ -36,11 +37,30 @@ input:
|
||||
|
||||
exp:
|
||||
NUM { $$ = ast_init(AST_TYPE_NUM, ast_num_data_init($1)); }
|
||||
| NEG NUM { $$ = ast_init(AST_TYPE_NUM, ast_num_data_init(-$2)); }
|
||||
| NUM PLUS NUM {
|
||||
AST** argv = calloc(2, sizeof(AST*));
|
||||
argv[0] = ast_init(AST_TYPE_NUM, ast_num_data_init($1));
|
||||
argv[1] = ast_init(AST_TYPE_NUM, ast_num_data_init($3));
|
||||
$$ = ast_init(AST_TYPE_CALL, ast_call_data_init("+", 2, argv));
|
||||
}
|
||||
| NEG NUM PLUS NUM {
|
||||
AST** argv = calloc(2, sizeof(AST*));
|
||||
argv[0] = ast_init(AST_TYPE_NUM, ast_num_data_init(-$2));
|
||||
argv[1] = ast_init(AST_TYPE_NUM, ast_num_data_init($4));
|
||||
$$ = ast_init(AST_TYPE_CALL, ast_call_data_init("+", 2, argv));
|
||||
}
|
||||
| NUM NEG NUM {
|
||||
AST** argv = calloc(2, sizeof(AST*));
|
||||
argv[0] = ast_init(AST_TYPE_NUM, ast_num_data_init($1));
|
||||
argv[1] = ast_init(AST_TYPE_NUM, ast_num_data_init($3));
|
||||
$$ = ast_init(AST_TYPE_CALL, ast_call_data_init("-", 2, argv));
|
||||
}
|
||||
| NEG NUM NEG NUM {
|
||||
AST** argv = calloc(2, sizeof(AST*));
|
||||
argv[0] = ast_init(AST_TYPE_NUM, ast_num_data_init(-$2));
|
||||
argv[1] = ast_init(AST_TYPE_NUM, ast_num_data_init($4));
|
||||
$$ = ast_init(AST_TYPE_CALL, ast_call_data_init("-", 2, argv));
|
||||
}
|
||||
|
||||
%%
|
||||
|
@ -65,6 +65,7 @@ int yylex() {
|
||||
switch (c) {
|
||||
case '+': return PLUS;
|
||||
case '\n': return NL;
|
||||
case '-': return NEG;
|
||||
default: return CALL;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user