quadratic evaluates
This commit is contained in:
parent
1e4c127762
commit
9d84cd0137
51
lab-5/expr.c
51
lab-5/expr.c
|
|
@ -3,6 +3,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
static struct SymbolMap *symbol_table = NULL;
|
static struct SymbolMap *symbol_table = NULL;
|
||||||
|
|
||||||
|
|
@ -34,12 +35,6 @@ struct stmt *stmt_create(stmt_t kind, struct decl *decl, struct expr *init_expr,
|
||||||
struct stmt *body, struct stmt *else_body,
|
struct stmt *body, struct stmt *else_body,
|
||||||
struct stmt *next) {
|
struct stmt *next) {
|
||||||
struct stmt *s = malloc(sizeof(*s));
|
struct stmt *s = malloc(sizeof(*s));
|
||||||
if (kind == STMT_COMPUTE) {
|
|
||||||
if (decl) {
|
|
||||||
printf("name: %s\n", decl->name->name);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s->kind = kind;
|
s->kind = kind;
|
||||||
s->decl = decl;
|
s->decl = decl;
|
||||||
s->init_expr = init_expr;
|
s->init_expr = init_expr;
|
||||||
|
|
@ -68,7 +63,7 @@ struct expr *expr_create(expr_t kind, struct expr *left, struct expr *right) {
|
||||||
|
|
||||||
struct expr *expr_create_name(const char *value) {
|
struct expr *expr_create_name(const char *value) {
|
||||||
struct expr *e = expr_create(EXPR_NAME, 0, 0);
|
struct expr *e = expr_create(EXPR_NAME, 0, 0);
|
||||||
char *dest = malloc(sizeof(*value));
|
char *dest = malloc(strlen(value) + 1);
|
||||||
strcpy(dest, value); // copy contents of source to dest
|
strcpy(dest, value); // copy contents of source to dest
|
||||||
e->name = dest;
|
e->name = dest;
|
||||||
return e;
|
return e;
|
||||||
|
|
@ -299,6 +294,9 @@ void stmt_evaluate(struct stmt *s) {
|
||||||
break;
|
break;
|
||||||
case STMT_END_EXECUTION:
|
case STMT_END_EXECUTION:
|
||||||
break;
|
break;
|
||||||
|
case STMT_COMPUTE:
|
||||||
|
stmt_evaluate_compute(s);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt_evaluate(s->next);
|
stmt_evaluate(s->next);
|
||||||
|
|
@ -323,13 +321,23 @@ void stmt_evaluate_print(struct expr *e) {
|
||||||
stmt_evaluate_print(e->right);
|
stmt_evaluate_print(e->right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void stmt_evaluate_compute(struct stmt *s) {
|
||||||
|
if (!s)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (s->kind == STMT_COMPUTE) {
|
||||||
|
decl_evaluate(s->decl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void decl_evaluate(struct decl *d) {
|
void decl_evaluate(struct decl *d) {
|
||||||
if (!d)
|
if (!d)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
printf("decl_evaluate\n");
|
if (!d->value) {
|
||||||
|
printf("decl_evaluate: no value\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (d->name->kind == EXPR_NAME && d->value->kind == EXPR_ARRAY) {
|
if (d->name->kind == EXPR_NAME && d->value->kind == EXPR_ARRAY) {
|
||||||
struct expr *e = expr_sub_evaluate(d->value);
|
struct expr *e = expr_sub_evaluate(d->value);
|
||||||
scope_bind(d->name->name, e);
|
scope_bind(d->name->name, e);
|
||||||
|
|
@ -446,6 +454,15 @@ float expr_subscript_evaluate(struct expr *e) {
|
||||||
return expr_evaluate(a->left);
|
return expr_evaluate(a->left);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float expr_evaluate_custom_function(struct expr *e) {
|
||||||
|
if (strcmp(e->left->name, "SQRT") == 0) {
|
||||||
|
return sqrt(expr_evaluate(e->right));
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("runtime error: unknown custom function\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
float expr_evaluate(struct expr *e) {
|
float expr_evaluate(struct expr *e) {
|
||||||
/* Careful: Return zero on null pointer. */
|
/* Careful: Return zero on null pointer. */
|
||||||
if (!e)
|
if (!e)
|
||||||
|
|
@ -456,10 +473,14 @@ float expr_evaluate(struct expr *e) {
|
||||||
|
|
||||||
float l = expr_evaluate(e->left);
|
float l = expr_evaluate(e->left);
|
||||||
float r = expr_evaluate(e->right);
|
float r = expr_evaluate(e->right);
|
||||||
|
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.
|
||||||
|
if (e->negative) {
|
||||||
|
return -expr_evaluate(scope_lookup(e->name));
|
||||||
|
}
|
||||||
return expr_evaluate(scope_lookup(e->name));
|
return expr_evaluate(scope_lookup(e->name));
|
||||||
case EXPR_ARRAY:
|
case EXPR_ARRAY:
|
||||||
printf("runtime error: array in expression\n");
|
printf("runtime error: array in expression\n");
|
||||||
|
|
@ -499,9 +520,19 @@ float expr_evaluate(struct expr *e) {
|
||||||
case EXPR_STRING_LITERAL:
|
case EXPR_STRING_LITERAL:
|
||||||
printf("runtime error: string in expression\n");
|
printf("runtime error: string in expression\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
case EXPR_VALUE:
|
||||||
|
return e->integer_value;
|
||||||
|
case EXPR_OCCURS:
|
||||||
|
return e->integer_value;
|
||||||
|
case EXPR_EXPONENTIAL:
|
||||||
|
return pow(l, r);
|
||||||
|
case EXPR_CUSTOM_FUNCTION:
|
||||||
|
result = expr_evaluate_custom_function(e);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void close_parser() { destroySymbolMap(symbol_table); }
|
void close_parser() { destroySymbolMap(symbol_table); }
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ struct decl {
|
||||||
struct expr *name;
|
struct expr *name;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
struct expr *value;
|
struct expr *value;
|
||||||
|
struct expr *occurs;
|
||||||
struct stmt *code;
|
struct stmt *code;
|
||||||
struct decl *next;
|
struct decl *next;
|
||||||
};
|
};
|
||||||
|
|
@ -122,6 +123,7 @@ void expr_print(struct expr *e);
|
||||||
void ast_print(struct stmt *e);
|
void ast_print(struct stmt *e);
|
||||||
|
|
||||||
void stmt_evaluate(struct stmt *e);
|
void stmt_evaluate(struct stmt *e);
|
||||||
|
void stmt_evaluate_compute(struct stmt *e);
|
||||||
void decl_evaluate(struct decl *e);
|
void decl_evaluate(struct decl *e);
|
||||||
void stmt_evaluate_print(struct expr *e);
|
void stmt_evaluate_print(struct expr *e);
|
||||||
void decl_subscript_evaluate(struct expr *e, float value);
|
void decl_subscript_evaluate(struct expr *e, float value);
|
||||||
|
|
@ -129,6 +131,7 @@ float expr_evaluate(struct expr *e);
|
||||||
struct expr *expr_sub_evaluate(struct expr *e);
|
struct expr *expr_sub_evaluate(struct expr *e);
|
||||||
float expr_subscript_evaluate(struct expr *e);
|
float expr_subscript_evaluate(struct expr *e);
|
||||||
const char *expr_string_evaluate(struct expr *e);
|
const char *expr_string_evaluate(struct expr *e);
|
||||||
|
float expr_evaluate_custom_function(struct expr *e);
|
||||||
|
|
||||||
void expr_delete(struct expr *e);
|
void expr_delete(struct expr *e);
|
||||||
void close_parser();
|
void close_parser();
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ int main(int argc, char *argv[]) {
|
||||||
if (parser_result != NULL) {
|
if (parser_result != NULL) {
|
||||||
stmt_print(parser_result);
|
stmt_print(parser_result);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("Running the program, results in: ");
|
printf("Running the program, results in: \n");
|
||||||
stmt_evaluate(parser_result);
|
stmt_evaluate(parser_result);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -262,9 +262,9 @@ data_clause : TOKEN_COMPUTATION_LEVEL_0
|
||||||
|
|
|
|
||||||
;
|
;
|
||||||
category_value : TOKEN_KEYWORD_VALUE TOKEN_INTEGER
|
category_value : TOKEN_KEYWORD_VALUE TOKEN_INTEGER
|
||||||
{$$ = expr_create_integer_literal(atoi(yytext));}
|
{$$ = expr_create_integer_literal(atoi(yytext)); $$->kind = EXPR_VALUE;}
|
||||||
| TOKEN_KEYWORD_OCCURS TOKEN_INTEGER
|
| TOKEN_KEYWORD_OCCURS TOKEN_INTEGER
|
||||||
{$$ = expr_create_integer_literal(atoi(yytext));}
|
{$$ = expr_create_integer_literal(atoi(yytext)); $$->kind = EXPR_OCCURS;}
|
||||||
|
|
|
|
||||||
{$$ = expr_create(EXPR_NULL, NULL, NULL);}
|
{$$ = expr_create(EXPR_NULL, NULL, NULL);}
|
||||||
;
|
;
|
||||||
|
|
@ -275,7 +275,7 @@ category_spec : complete_category
|
||||||
;
|
;
|
||||||
//TODO: implement levels
|
//TODO: implement levels
|
||||||
simple_decl : TOKEN_INTEGER ident TOKEN_DOT
|
simple_decl : TOKEN_INTEGER ident TOKEN_DOT
|
||||||
{$$ = decl_create($2, NULL, NULL, NULL, NULL);}
|
{$$ = decl_create($2, NULL, expr_create(EXPR_NULL, NULL, NULL), NULL, NULL);}
|
||||||
;
|
;
|
||||||
complex_decl : TOKEN_INTEGER ident TOKEN_PICTURE category_spec TOKEN_DOT
|
complex_decl : TOKEN_INTEGER ident TOKEN_PICTURE category_spec TOKEN_DOT
|
||||||
{$$ = decl_create($2, $4->type, $4->value, NULL, NULL);}
|
{$$ = decl_create($2, $4->type, $4->value, NULL, NULL);}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
PROCEDURE DIVISION. *> program begins here
|
PROCEDURE DIVISION. *> program begins here
|
||||||
DISPLAY "EQUATION: (1x^2) + 5x + 6 = 0"
|
DISPLAY "EQUATION: (1x^2) + 5x + 6 = 0"
|
||||||
COMPUTE discriminant = (b ** 2) - (4 * a * c)
|
COMPUTE discriminant = (b ** 2) - (4 * a * c)
|
||||||
|
|
||||||
IF discriminant > 0
|
IF discriminant > 0
|
||||||
COMPUTE square-root-discriminant = FUNCTION SQRT(discriminant)
|
COMPUTE square-root-discriminant = FUNCTION SQRT(discriminant)
|
||||||
COMPUTE root1 = (-b + square-root-discriminant) / (2 * a)
|
COMPUTE root1 = (-b + square-root-discriminant) / (2 * a)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue