fix branching
This commit is contained in:
parent
5ca58de9c6
commit
fd10dae2ba
|
|
@ -42,5 +42,5 @@ parser.c parser.h: parser.bison
|
||||||
# clean causes all intermediate files to be deleted.
|
# clean causes all intermediate files to be deleted.
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f parser.c parser.output parser.h scanner.c *.o interpreter.out interpreter_test.out test_evaluate.txt test_print.txt
|
rm -f parser.c parser.output parser.h scanner.c *.o interpreter.out interpreter_test.out test_evaluate.txt test_print.txt parser_test.out scanner_test.out
|
||||||
|
|
||||||
|
|
|
||||||
12
lab-5/expr.c
12
lab-5/expr.c
|
|
@ -191,13 +191,15 @@ void expr_print(struct expr *e) {
|
||||||
close = "]";
|
close = "]";
|
||||||
} else if (e->kind != EXPR_NAME && e->kind != EXPR_SUBSCRIPT &&
|
} else if (e->kind != EXPR_NAME && e->kind != EXPR_SUBSCRIPT &&
|
||||||
e->kind != EXPR_INTEGER_LITERAL && e->kind != EXPR_FLOAT_LITERAL &&
|
e->kind != EXPR_INTEGER_LITERAL && e->kind != EXPR_FLOAT_LITERAL &&
|
||||||
e->kind != EXPR_STRING_LITERAL && e->kind != EXPR_CUSTOM_FUNCTION) {
|
e->kind != EXPR_STRING_LITERAL && e->kind != EXPR_CUSTOM_FUNCTION &&
|
||||||
|
e->kind != EXPR_VALUE) {
|
||||||
printf("(");
|
printf("(");
|
||||||
close = ")";
|
close = ")";
|
||||||
} else if (e->kind == EXPR_CUSTOM_FUNCTION) {
|
} else if (e->kind == EXPR_CUSTOM_FUNCTION) {
|
||||||
printf("FUNCTION ");
|
printf("FUNCTION ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
expr_print(e->left);
|
expr_print(e->left);
|
||||||
|
|
||||||
switch (e->kind) {
|
switch (e->kind) {
|
||||||
|
|
@ -246,6 +248,7 @@ void expr_print(struct expr *e) {
|
||||||
case EXPR_LESS_THAN_OR_EQUAL:
|
case EXPR_LESS_THAN_OR_EQUAL:
|
||||||
printf("<=");
|
printf("<=");
|
||||||
break;
|
break;
|
||||||
|
case EXPR_VALUE:
|
||||||
case EXPR_INTEGER_LITERAL:
|
case EXPR_INTEGER_LITERAL:
|
||||||
printf("%d", e->integer_value);
|
printf("%d", e->integer_value);
|
||||||
break;
|
break;
|
||||||
|
|
@ -288,6 +291,10 @@ void stmt_evaluate(struct stmt *s) {
|
||||||
case STMT_IF:
|
case STMT_IF:
|
||||||
if (expr_evaluate(s->expr)) {
|
if (expr_evaluate(s->expr)) {
|
||||||
stmt_evaluate(s->body);
|
stmt_evaluate(s->body);
|
||||||
|
} else {
|
||||||
|
if (s->else_body) {
|
||||||
|
stmt_evaluate(s->else_body);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STMT_PRINT:
|
case STMT_PRINT:
|
||||||
|
|
@ -409,6 +416,8 @@ const char *expr_string_evaluate(struct expr *e) {
|
||||||
case EXPR_LESS_THAN:
|
case EXPR_LESS_THAN:
|
||||||
case EXPR_LESS_THAN_OR_EQUAL:
|
case EXPR_LESS_THAN_OR_EQUAL:
|
||||||
case EXPR_INTEGER_LITERAL:
|
case EXPR_INTEGER_LITERAL:
|
||||||
|
case EXPR_VALUE:
|
||||||
|
case EXPR_OCCURS:
|
||||||
case EXPR_FLOAT_LITERAL:
|
case EXPR_FLOAT_LITERAL:
|
||||||
printf("runtime error: not a string expression\n");
|
printf("runtime error: not a string expression\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
@ -482,6 +491,7 @@ float expr_evaluate(struct expr *e) {
|
||||||
float r = expr_evaluate(e->right);
|
float r = expr_evaluate(e->right);
|
||||||
float result;
|
float result;
|
||||||
|
|
||||||
|
|
||||||
switch (e->kind) {
|
switch (e->kind) {
|
||||||
case EXPR_NAME:
|
case EXPR_NAME:
|
||||||
// Get the variable expression and then evaluate it.
|
// Get the variable expression and then evaluate it.
|
||||||
|
|
|
||||||
|
|
@ -225,7 +225,7 @@ else_parts : else_branch
|
||||||
else_branch : TOKEN_ELSE_IF booleanexpr simple_stmt
|
else_branch : TOKEN_ELSE_IF booleanexpr simple_stmt
|
||||||
{$$ = stmt_create(STMT_IF, NULL, NULL, $2, NULL, $3, NULL, NULL);}
|
{$$ = stmt_create(STMT_IF, NULL, NULL, $2, NULL, $3, NULL, NULL);}
|
||||||
| TOKEN_ELSE simple_stmt
|
| TOKEN_ELSE simple_stmt
|
||||||
{$$ = stmt_create(STMT_IF, NULL, NULL, NULL, NULL, $2, NULL, NULL);}
|
{$$ = stmt_create(STMT_IF, NULL, NULL, expr_create(EXPR_EQUAL_EQUAL, expr_create_integer_literal(0), expr_create_integer_literal(0)), NULL, $2, NULL, NULL);}
|
||||||
| TOKEN_END_IF
|
| TOKEN_END_IF
|
||||||
{$$ = NULL;}
|
{$$ = NULL;}
|
||||||
perform_stmt : TOKEN_PERFORM TOKEN_VARYING ident TOKEN_KEYWORD_FROM TOKEN_INTEGER TOKEN_KEYWORD_BY TOKEN_INTEGER TOKEN_UNTIL op_parms
|
perform_stmt : TOKEN_PERFORM TOKEN_VARYING ident TOKEN_KEYWORD_FROM TOKEN_INTEGER TOKEN_KEYWORD_BY TOKEN_INTEGER TOKEN_UNTIL op_parms
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,14 @@
|
||||||
IDENTIFICATION DIVISION.
|
IDENTIFICATION DIVISION.
|
||||||
PROGRAM-ID. BRANCHING.
|
PROGRAM-ID. BRANCHING.
|
||||||
|
DATA DIVISION.
|
||||||
|
WORKING-STORAGE SECTION.
|
||||||
|
05 A PIC S9(2) VALUE 1.
|
||||||
|
05 B PIC S9(2) VALUE 2.
|
||||||
PROCEDURE DIVISION.
|
PROCEDURE DIVISION.
|
||||||
IF A > B THEN
|
IF A > B
|
||||||
DISPLAY 'A is greater than B'
|
DISPLAY 'A is greater than B'
|
||||||
|
ELSE IF A = B
|
||||||
|
DISPLAY 'A is equal to B'
|
||||||
ELSE
|
ELSE
|
||||||
DISPLAY 'B is greater than A'
|
DISPLAY 'B is greater than A'
|
||||||
END-IF
|
END-IF
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
B is greater than A
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
section
|
||||||
|
section
|
||||||
|
section
|
||||||
|
section
|
||||||
|
A = 1;
|
||||||
|
B = 2;
|
||||||
|
section
|
||||||
|
if (A>B) then
|
||||||
|
print A is greater than B;
|
||||||
|
endif
|
||||||
|
else if (0==0) then
|
||||||
|
if (A==B) then
|
||||||
|
print A is equal to B;
|
||||||
|
endif
|
||||||
|
else if (0==0) then
|
||||||
|
print B is greater than A;
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
stop run
|
||||||
|
|
@ -2,9 +2,9 @@ section
|
||||||
section
|
section
|
||||||
section
|
section
|
||||||
section
|
section
|
||||||
a = ();
|
a = 1;
|
||||||
b = ();
|
b = 5;
|
||||||
c = ();
|
c = 6;
|
||||||
discriminant = ();
|
discriminant = ();
|
||||||
root1 = ();
|
root1 = ();
|
||||||
root2 = ();
|
root2 = ();
|
||||||
|
|
@ -20,13 +20,13 @@ print The equation has two distinct real roots: ;
|
||||||
print Root 1: root1;
|
print Root 1: root1;
|
||||||
print Root 2: root2;
|
print Root 2: root2;
|
||||||
endif
|
endif
|
||||||
else if then
|
else if (0==0) then
|
||||||
if (discriminant==0) then
|
if (discriminant==0) then
|
||||||
compute root1 = (-b/(2*a));
|
compute root1 = (-b/(2*a));
|
||||||
print The equation has one real root: ;
|
print The equation has one real root: ;
|
||||||
print Root: root1;
|
print Root: root1;
|
||||||
endif
|
endif
|
||||||
else if then
|
else if (0==0) then
|
||||||
print The equation has no real roots.;
|
print The equation has no real roots.;
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue