make move statements work

This commit is contained in:
vel 2024-11-17 01:53:36 -08:00
parent fd10dae2ba
commit 5e5e151f27
Signed by: velvox
GPG Key ID: 59D9762F674151DF
8 changed files with 68 additions and 52 deletions

View File

@ -161,9 +161,9 @@ void stmt_print(struct stmt *s) {
break;
case STMT_MOVE:
printf("move ");
expr_print(s->decl->name);
printf(" to ");
expr_print(s->decl->value);
printf(" to ");
expr_print(s->decl->name);
printf(";\n");
break;
case STMT_END_EXECUTION:
@ -282,6 +282,7 @@ void stmt_evaluate(struct stmt *s) {
return;
switch (s->kind) {
case STMT_MOVE:
case STMT_DECL:
decl_evaluate(s->decl);
break;
@ -322,12 +323,14 @@ void stmt_evaluate_print(struct expr *e) {
if (e->kind == EXPR_STRING_LITERAL) {
printf("%s", expr_string_evaluate(e));
} else if (e->kind == EXPR_FLOAT_LITERAL) {
printf("%f", expr_evaluate(e));
} else if (e->kind == EXPR_INTEGER_LITERAL ||
e->kind == EXPR_NAME || e->kind == EXPR_SUBSCRIPT) {
printf("%s", expr_string_evaluate(e));
} else if (e->kind == EXPR_FLOAT_LITERAL) {
printf("%f", expr_evaluate(e));
} else if (e->kind == EXPR_INTEGER_LITERAL || e->kind == EXPR_SUBSCRIPT) {
printf("%.0f", expr_evaluate(e));
} else if (e->kind == EXPR_NAME) {
struct expr *value = scope_lookup(e->name);
stmt_evaluate_print(value);
} else {
printf("runtime error: print expression is not literal\n");
}
@ -356,9 +359,15 @@ void decl_evaluate(struct decl *d) {
struct expr *e = expr_sub_evaluate(d->value);
scope_bind(d->name->name, e);
} else if (d->name->kind == EXPR_NAME) {
float value = expr_evaluate(d->value);
struct expr *e = expr_create_float_literal(value);
scope_bind(d->name->name, e);
if (d->value->kind != EXPR_STRING_LITERAL) {
float value = expr_evaluate(d->value);
struct expr *e = expr_create_float_literal(value);
scope_bind(d->name->name, e);
} else {
const char *value = expr_string_evaluate(d->value);
struct expr *e = expr_create_string_literal(value);
scope_bind(d->name->name, e);
}
} else if (d->name->kind == EXPR_SUBSCRIPT) {
float value = expr_evaluate(d->value);
decl_subscript_evaluate(d->name, value);

View File

@ -117,24 +117,6 @@ UTEST_F_TEARDOWN(InterpreterTestFile) {
ASSERT_STREQ(actual_evaluate, expected_evaluate);
}
UTEST_F(InterpreterTestFile, helloworld) {
utest_fixture->test_file = "samples/hello-world.cbl";
utest_fixture->print_file = "samples/outputs/hello-world_print.txt";
utest_fixture->evaluated_file = "samples/outputs/hello-world_evaluate.txt";
}
UTEST_F(InterpreterTestFile, quadratic) {
utest_fixture->test_file = "samples/quadratic-snippet.cbl";
utest_fixture->print_file = "samples/outputs/quadratic_print.txt";
utest_fixture->evaluated_file = "samples/outputs/quadratic_evaluate.txt";
}
UTEST_F(InterpreterTestFile, sorting) {
utest_fixture->test_file = "samples/sorting-snippet.cbl";
utest_fixture->print_file = "samples/outputs/sorting_print.txt";
utest_fixture->evaluated_file = "samples/outputs/sorting_evaluate.txt";
}
UTEST_F(InterpreterTestFile, assignment) {
utest_fixture->test_file = "samples/assignment.cbl";
utest_fixture->print_file = "samples/outputs/assignment_print.txt";
@ -158,3 +140,21 @@ UTEST_F(InterpreterTestFile, looping) {
utest_fixture->print_file = "samples/outputs/looping_print.txt";
utest_fixture->evaluated_file = "samples/outputs/looping_evaluate.txt";
}
UTEST_F(InterpreterTestFile, helloworld) {
utest_fixture->test_file = "samples/hello-world.cbl";
utest_fixture->print_file = "samples/outputs/hello-world_print.txt";
utest_fixture->evaluated_file = "samples/outputs/hello-world_evaluate.txt";
}
UTEST_F(InterpreterTestFile, quadratic) {
utest_fixture->test_file = "samples/quadratic-snippet.cbl";
utest_fixture->print_file = "samples/outputs/quadratic_print.txt";
utest_fixture->evaluated_file = "samples/outputs/quadratic_evaluate.txt";
}
UTEST_F(InterpreterTestFile, sorting) {
utest_fixture->test_file = "samples/sorting-snippet.cbl";
utest_fixture->print_file = "samples/outputs/sorting_print.txt";
utest_fixture->evaluated_file = "samples/outputs/sorting_evaluate.txt";
}

View File

@ -94,9 +94,9 @@ extern struct stmt *parser_result = 0;
struct type *type;
}
%type <stmt> statement_list statement section stop_run sect_data simple_stmt cbl_func_stmt cbl_function if_branch else_parts else_branch perform_stmt data_space
%type <stmt> statement_list statement section stop_run sect_data simple_stmt cbl_func_stmt if_branch else_parts else_branch perform_stmt data_space display_stmt assignment_stmt
%type <expr> mathmaticalexpr booleanexpr term op_parm container_expr type_expr op_parms math_op categry_contain category_value ident ext_function
%type <decl> assignment_stmt simple_decl complex_decl data_declaration category_spec
%type <decl> simple_decl complex_decl data_declaration category_spec
%type <type> data_category complete_category data_clause
%%
file : statement_list
@ -139,15 +139,17 @@ simple_stmt : cbl_func_stmt
{$$ = $1;}
| perform_stmt
;
cbl_func_stmt : cbl_function type_expr assignment_stmt
{ $3->name = $2; $$= stmt_create($1->kind, $3, NULL, NULL, NULL, NULL, NULL, NULL);}
| cbl_function op_parms
{$$ = stmt_create($1->kind, NULL, NULL, $2, NULL, NULL, NULL, NULL);}
cbl_func_stmt : display_stmt
{$$ = $1;}
| assignment_stmt
{$$ = $1;}
;
assignment_stmt : TOKEN_EQUAL op_parms
{$$ = decl_create(NULL, NULL, $2, NULL, NULL);}
| TOKEN_KEYWORD_TO op_parms
{$$ = decl_create(NULL, NULL, $2, NULL, NULL);}
display_stmt : TOKEN_DISPLAY op_parms
{$$ = stmt_create(STMT_PRINT, NULL, NULL, $2, NULL, NULL, NULL, NULL);}
assignment_stmt : TOKEN_KEYWORD_COMPUTE ident TOKEN_EQUAL op_parms
{$$ = stmt_create(STMT_COMPUTE, decl_create($2, NULL, $4, NULL, NULL), NULL, NULL, NULL, NULL, NULL, NULL);}
| TOKEN_MOVE type_expr TOKEN_KEYWORD_TO ident
{$$ = stmt_create(STMT_MOVE, decl_create($4, NULL, $2, NULL, NULL), NULL, NULL, NULL, NULL, NULL, NULL);}
;
op_parms : op_parm
{$$ = $1;}
@ -208,13 +210,6 @@ type_expr : ident
ext_function : TOKEN_KEYWORD_FUNCTION ident TOKEN_LEFT_PARENTHESIS ident TOKEN_RIGHT_PARENTHESIS
{$$ = expr_create(EXPR_CUSTOM_FUNCTION, $2, $4);}
;
cbl_function : TOKEN_DISPLAY
{$$ = stmt_create(STMT_PRINT, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
| TOKEN_MOVE
{$$ = stmt_create(STMT_MOVE, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
| TOKEN_KEYWORD_COMPUTE
{$$ = stmt_create(STMT_COMPUTE, NULL, NULL, NULL, NULL, NULL, NULL, NULL);}
;
if_branch : TOKEN_IF booleanexpr statement_list else_parts
{$$ = stmt_create(STMT_IF, NULL, NULL, $2, NULL, $3, $4, NULL);}
;
@ -267,9 +262,7 @@ category_value : TOKEN_KEYWORD_VALUE TOKEN_INTEGER
|
{$$ = expr_create(EXPR_NULL, NULL, NULL);}
;
category_spec : complete_category
{$$ = decl_create(NULL, $1, NULL, NULL, NULL);}
| complete_category data_clause category_value
category_spec : complete_category data_clause category_value
{ $1->level = $2->level; $$ = decl_create(NULL, $1, $3, NULL, NULL);}
;
//TODO: implement levels

View File

@ -3,7 +3,13 @@ PROGRAM-ID. ASSIGNMENT.
DATA DIVISION.
WORKING-STORAGE SECTION.
05 A PIC 9(2).
05 B PIC 9(2).
05 C PIC X(10).
PROCEDURE DIVISION.
MOVE 1 TO A
MOVE 2 TO B
MOVE "Hello, World!" TO C
DISPLAY A
DISPLAY B
DISPLAY C
STOP RUN.

View File

@ -1 +1 @@
2
2.000000

View File

@ -1 +1,3 @@
1
1.000000
2.000000
Hello, World!

View File

@ -3,7 +3,13 @@ section
section
section
A = ();
B = ();
C = ();
section
move 1 to A;
move 2 to B;
move Hello, World! to C;
print A;
print B;
print C;
stop run

View File

@ -1,4 +1,4 @@
EQUATION: (1x^2) + 5x + 6 = 0
The equation has two distinct real roots:
Root 1: -2
Root 2: -3
Root 1: -2.000000
Root 2: -3.000000