Merge branch 'variables'.
This commit is contained in:
		
							
								
								
									
										14
									
								
								src/ast.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/ast.c
									
									
									
									
									
								
							| @@ -27,6 +27,7 @@ void ast_destroy(AST* ast) { | ||||
|     switch (ast->type) { | ||||
|         case AST_TYPE_NUM:  ast_num_data_destroy(ast->data); break; | ||||
|         case AST_TYPE_CALL: ast_call_data_destroy(ast->data); break; | ||||
|         case AST_TYPE_VREF: ast_vref_data_destroy(ast->data); break; | ||||
|         default: | ||||
|             log_dbgf("Unknown ast type %d (max: %d)", ast->type, AST_TYPE_MAX); | ||||
|     } | ||||
| @@ -103,9 +104,18 @@ void ast_call_print(ASTCallData* data, int i) { | ||||
|     INDENT_END; | ||||
| } | ||||
|  | ||||
| ASTVrefData* ast_vref_data_init(char* to) {} | ||||
| ASTVrefData* ast_vref_data_init(char* to) { | ||||
|     talloc(ASTVrefData, vref); | ||||
|  | ||||
| void ast_vref_data_destroy(ASTVrefData* vref) {} | ||||
|     vref->to = to; | ||||
|  | ||||
|     return vref; | ||||
| } | ||||
|  | ||||
| void ast_vref_data_destroy(ASTVrefData* vref) { | ||||
|     free(vref->to); | ||||
|     free(vref); | ||||
| } | ||||
|  | ||||
| void ast_vref_print(ASTVrefData* data, int i) { | ||||
|     INDENT_BEGIN(i); | ||||
|   | ||||
| @@ -13,6 +13,7 @@ ASTNumData exec_exp(AST* ast) { | ||||
|     switch (ast->type) { | ||||
|         case AST_TYPE_CALL: return exec_call(ast); | ||||
|         case AST_TYPE_NUM:  return *(ASTNumData*)ast->data; | ||||
|         case AST_TYPE_VREF: return exec_vref(ast); | ||||
|         default:            printf("what\n"); | ||||
|                             exit(1); | ||||
|     } | ||||
| @@ -67,4 +68,8 @@ ASTNumData exec_call(AST* ast) { | ||||
|     return -1000; | ||||
| } | ||||
|  | ||||
| ASTNumData exec_vref(AST* ast) { | ||||
|     return *ast_num_data_init(42.42); | ||||
| } | ||||
|  | ||||
| void exec_print(double n) { printf("= %lf\n", n); } | ||||
|   | ||||
| @@ -27,6 +27,8 @@ | ||||
| %token RGROUP | ||||
| %token SEP | ||||
|  | ||||
| %token EXPSEP | ||||
|  | ||||
| %token<strval> WORD | ||||
| %token<fval> NUM | ||||
|  | ||||
| @@ -50,6 +52,7 @@ | ||||
| input: | ||||
|     %empty | ||||
|     | exp { root = $1; } | ||||
|     | input EXPSEP exp { root = $3; } | ||||
|     ; | ||||
|  | ||||
|  | ||||
| @@ -84,7 +87,9 @@ exp: | ||||
|     | LGROUP exp RGROUP { $$ = $2; } | ||||
|  | ||||
|     // Variable reference. | ||||
|     //| WORD | ||||
|     | WORD { | ||||
|         $$ = ast_init(AST_TYPE_VREF, ast_vref_data_init($1)); | ||||
|     } | ||||
|  | ||||
|     | WORD LGROUP arg RGROUP { | ||||
|         size_t argc = $3->ln; | ||||
|   | ||||
| @@ -5,6 +5,7 @@ | ||||
|  | ||||
| ASTNumData exec_exp(AST* ast); | ||||
| ASTNumData exec_call(AST* ast); | ||||
| ASTNumData exec_vref(AST* ast); | ||||
| void exec_print(double n); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -112,6 +112,7 @@ int yylex() { | ||||
|         case '(':  return LGROUP; | ||||
|         case ')':  return RGROUP; | ||||
|         case ',':  return SEP; | ||||
|         case ';': return EXPSEP; | ||||
|         default:   fprintf(stderr, "Unexpected character: %c\n", c); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -82,3 +82,16 @@ bin() { ./scl.out $1 | tail -n1; } | ||||
|     run bin "-(-(1+2)*3)" | ||||
|     [ "$output" = "= 9.000000" ] | ||||
| } | ||||
|  | ||||
| @test "multiple expressions per line" { | ||||
|     run bin "1+1;2" | ||||
|     [ "$output" = "= 2.000000" ] | ||||
| } | ||||
|  | ||||
| @test "variable definition" { | ||||
|     run bin "x = 1" | ||||
|     [ "$output" = "= 1.000000" ] | ||||
|  | ||||
|     run bin "x = 1; x + 1" | ||||
|     [ "$output" = "= 2.000000" ] | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user