Fix bugs
Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar> Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar>
This commit is contained in:
parent
598d7b1d49
commit
7e07b851ab
|
@ -33,6 +33,7 @@ Se recomienda usar `pip` para instalar `SymPy`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install --user sympy==1.5.1
|
pip install --user sympy==1.5.1
|
||||||
|
export PATH="$PATH:$HOME/.local/bin"
|
||||||
```
|
```
|
||||||
|
|
||||||
Luego, debe instalar `symbolic` en octave corriendo:
|
Luego, debe instalar `symbolic` en octave corriendo:
|
||||||
|
|
81
main.c
81
main.c
|
@ -1,81 +0,0 @@
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
long fact(int n) {
|
|
||||||
if (n == 0) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return n * fact(n-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double Differentiate(double f(double x), double x, double h, int grade) {
|
|
||||||
double sum = 0;
|
|
||||||
for (int i = 0; i <= grade; i++) {
|
|
||||||
printf("%g %d %g %g\n", h, grade, pow(h, 4), pow(h, grade));
|
|
||||||
// printf("%d %f %f %f %g\n", i, sum, fact(grade) / (fact(i) * fact(grade - i)), f(x + (double) i * h), pow(h, grade));
|
|
||||||
sum += pow(-1, grade - i) * (fact(grade) / (fact(i) * fact(grade - i))) * f(x + (double) i * h) / pow(h, grade);
|
|
||||||
}
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
double f(double x) {
|
|
||||||
return x*x*x*x*x - x/(2-x*x);
|
|
||||||
}
|
|
||||||
|
|
||||||
double SimpsonsRule(double f(double x), double a, double b, int errGrade) {
|
|
||||||
int res = 0;
|
|
||||||
double der4;
|
|
||||||
double c, cmax;
|
|
||||||
for (c = a; c <= b; c += 0.1) {
|
|
||||||
der4 = Differentiate(f, c, sqrt(__DBL_EPSILON__), 4);
|
|
||||||
if (res < der4) {
|
|
||||||
res = der4;
|
|
||||||
cmax = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%f\n", cmax);
|
|
||||||
double limit = pow(10, -errGrade), n = 1;
|
|
||||||
double h = fabs(b-a) / n;
|
|
||||||
double err = (b-a) * pow(h, 4) * res / 180;
|
|
||||||
while (err > limit) {
|
|
||||||
printf("%g %g\n", err, limit);
|
|
||||||
n++;
|
|
||||||
h = fabs(b-a) / n;
|
|
||||||
err = (b-a) * pow(h, 4) * res / (double) 180;
|
|
||||||
}
|
|
||||||
printf("%d", n);
|
|
||||||
|
|
||||||
// function s=simpson(f,a,b,n)
|
|
||||||
// h=(b-a)/n;
|
|
||||||
// y=[];for x=a:h:b;y=[y f(x)];end
|
|
||||||
// E=y(1)+y(end);
|
|
||||||
// P=sum(y(3:2:end-2)); Im=sum(y(2:2:end-1));
|
|
||||||
// s=(h/3)*(E+2*P+4*Im);
|
|
||||||
// end
|
|
||||||
|
|
||||||
double x, sum = 0;
|
|
||||||
int i = 0; // de 2 a n-1
|
|
||||||
while (i < n) {
|
|
||||||
x = a + i * h;
|
|
||||||
if (i % 2 == 0) {
|
|
||||||
sum += 2 * f(x);
|
|
||||||
} else {
|
|
||||||
sum += 4 * f(x);
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return (h/3) * (f(a) + f(b) + sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
double g(double x) {
|
|
||||||
return 1/(x*x*x) + x*x;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
// printf("%f", )
|
|
||||||
// printf("der %f\n", Differentiate(g, 1, pow(10, -1), 4));
|
|
||||||
// printf("der %f\n", );
|
|
||||||
// printf("culo %g", SimpsonsRule(g, 1, 8, 5));
|
|
||||||
}
|
|
|
@ -1,4 +1,3 @@
|
||||||
#include "../support/logger.h"
|
|
||||||
#include "free-tree.h"
|
#include "free-tree.h"
|
||||||
|
|
||||||
MallocTable * table;
|
MallocTable * table;
|
||||||
|
@ -25,296 +24,3 @@ void FreeMallocTable() {
|
||||||
free(table->elements);
|
free(table->elements);
|
||||||
free(table);
|
free(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
// void FreeDerivative(Derivative * derivative) {
|
|
||||||
// free(derivative->function);
|
|
||||||
// free(derivative->grade);
|
|
||||||
// FreeExpression(derivative->value);
|
|
||||||
// free(derivative);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeIntegrate(Integrate * integrate) {
|
|
||||||
// free(integrate->function);
|
|
||||||
// FreeExpression(integrate->lvalue);
|
|
||||||
// FreeExpression(integrate->rvalue);
|
|
||||||
// if (integrate->error != NULL)
|
|
||||||
// free(integrate->error);
|
|
||||||
// free(integrate);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeEvaluate(Evaluate * evaluate) {
|
|
||||||
// free(evaluate->function);
|
|
||||||
// FreeExpression(evaluate->value);
|
|
||||||
// free(evaluate);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeExpression(Expression * expression) {
|
|
||||||
// switch (expression->type) {
|
|
||||||
// case DERIVATIVE_EXPRESSION:
|
|
||||||
// FreeDerivative(expression->derivative);
|
|
||||||
// break;
|
|
||||||
// case INTEGRATE_EXPRESSION:
|
|
||||||
// FreeIntegrate(expression->integrate);
|
|
||||||
// break;
|
|
||||||
// case EVALUATE_EXPRESSION:
|
|
||||||
// FreeEvaluate(expression->evaluate);
|
|
||||||
// break;
|
|
||||||
// case NEGATIVE_EXPRESSION:
|
|
||||||
// case PARENTHESIS_EXPRESSION:
|
|
||||||
// FreeExpression(expression->leftExpression);
|
|
||||||
// break;
|
|
||||||
// case NUMBER_EXPRESSION:
|
|
||||||
// break;
|
|
||||||
// case ADD_EXPRESSION:
|
|
||||||
// case SUB_EXPRESSION:
|
|
||||||
// case MUL_EXPRESSION:
|
|
||||||
// case DIV_EXPRESSION:
|
|
||||||
// case POW_EXPRESSION:
|
|
||||||
// FreeExpression(expression->leftExpression);
|
|
||||||
// FreeExpression(expression->rightExpression);
|
|
||||||
// break;
|
|
||||||
// case ID_EXPRESSION:
|
|
||||||
// free(expression->id);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// free(expression);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeDomain(Domain * domain) {
|
|
||||||
// switch (domain->type) {
|
|
||||||
// case GREATER_DOMAIN:
|
|
||||||
// case GREATER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_DOMAIN:
|
|
||||||
// case EQUAL_DOMAIN:
|
|
||||||
// case NOT_EQUAL_DOMAIN:
|
|
||||||
// FreeExpression(domain->left);
|
|
||||||
// FreeExpression(domain->right);
|
|
||||||
// break;
|
|
||||||
// case LESSER_LESSER_DOMAIN:
|
|
||||||
// case LESSER_LESSER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_EQUAL_LESSER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_EQUAL_LESSER_DOMAIN:
|
|
||||||
// // FreeExpression(domain->left);
|
|
||||||
// // FreeExpression(domain->mid);
|
|
||||||
// // FreeExpression(domain->right);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// abort();
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// free(domain);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeDomainForFunction(Domain * domain) {
|
|
||||||
// switch (domain->type) {
|
|
||||||
// case GREATER_DOMAIN:
|
|
||||||
// case GREATER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_DOMAIN:
|
|
||||||
// case EQUAL_DOMAIN:
|
|
||||||
// case NOT_EQUAL_DOMAIN:
|
|
||||||
// FreeExpression(domain->left);
|
|
||||||
// FreeExpression(domain->right);
|
|
||||||
// break;
|
|
||||||
// case LESSER_LESSER_DOMAIN:
|
|
||||||
// case LESSER_LESSER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_EQUAL_LESSER_EQUAL_DOMAIN:
|
|
||||||
// case LESSER_EQUAL_LESSER_DOMAIN:
|
|
||||||
// FreeExpression(domain->left);
|
|
||||||
// FreeExpression(domain->mid);
|
|
||||||
// FreeExpression(domain->right);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// free(domain);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeBoolean(Boolean * boolean) {
|
|
||||||
// switch (boolean->type) {
|
|
||||||
// case DOMAIN_BOOLEAN:
|
|
||||||
// FreeDomain(boolean->domain);
|
|
||||||
// break;
|
|
||||||
// case OR_BOOLEAN:
|
|
||||||
// case AND_BOOLEAN:
|
|
||||||
// FreeBoolean(boolean->left);
|
|
||||||
// FreeBoolean(boolean->right);
|
|
||||||
// break;
|
|
||||||
// case NOT_BOOLEAN:
|
|
||||||
// case BOOLEAN:
|
|
||||||
// FreeBoolean(boolean->left);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// free(boolean);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeIf(If * if_st) {
|
|
||||||
// FreeBoolean(if_st->boolean);
|
|
||||||
// FreeBlock(if_st->block);
|
|
||||||
// if (if_st->else_block != NULL) {
|
|
||||||
// FreeBlock(if_st->else_block);
|
|
||||||
// }
|
|
||||||
// free(if_st);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeFor(For * for_st) {
|
|
||||||
// if (for_st->init_variable != NULL)
|
|
||||||
// FreeDeclareVariable(for_st->init_variable);
|
|
||||||
// FreeBoolean(for_st->boolean);
|
|
||||||
// FreeAssignVariable(for_st->action_variable);
|
|
||||||
// FreeBlock(for_st->block);
|
|
||||||
// free(for_st);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// void FreeBlock(Block * block) {
|
|
||||||
// Statement * statement = block->statement, * aux;
|
|
||||||
// while (statement != NULL) {
|
|
||||||
// aux = statement;
|
|
||||||
// statement = statement->next;
|
|
||||||
// FreeStatement(aux);
|
|
||||||
// }
|
|
||||||
// free(block);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeDeclareVariable(Variable * variable) {
|
|
||||||
// free(variable->name);
|
|
||||||
// if (variable->value != NULL) {
|
|
||||||
// FreeExpression(variable->value);
|
|
||||||
// }
|
|
||||||
// free(variable);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeAssignVariable(AssignVariable * variable) {
|
|
||||||
// switch (variable->type) {
|
|
||||||
// case INCREMENT_EXPRESSION:
|
|
||||||
// case DECREMENT_EXPRESSION:
|
|
||||||
// break;
|
|
||||||
// case ADD_ASSIGN_EXPRESSION:
|
|
||||||
// case SUB_ASSIGN_EXPRESSION:
|
|
||||||
// case MUL_ASSIGN_EXPRESSION:
|
|
||||||
// case DIV_ASSIGN_EXPRESSION:
|
|
||||||
// case ASSIGN_EXPRESSION:
|
|
||||||
// FreeExpression(variable->expression);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// free(variable->id);
|
|
||||||
// free(variable);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreePrint(Print * print_st) {
|
|
||||||
// switch (print_st->type) {
|
|
||||||
// case STRING_PRINT:
|
|
||||||
// free(print_st->string);
|
|
||||||
// break;
|
|
||||||
// case EXPRESSION_PRINT:
|
|
||||||
// FreeExpression(print_st->expression);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// free(print_st);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeWhile(While * while_st) {
|
|
||||||
// FreeBoolean(while_st->boolean);
|
|
||||||
// FreeBlock(while_st->block);
|
|
||||||
// free(while_st);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeCompositeFunction(Composite * composite) {
|
|
||||||
// switch (composite->type) {
|
|
||||||
// case ID_COMPOSITE:
|
|
||||||
// free(composite->inner_func);;
|
|
||||||
// break;
|
|
||||||
// case COMPOSITE_COMPOSITE:
|
|
||||||
// FreeCompositeFunction(composite->inner_comp);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// LogError("Invalid composite function");
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// free(composite->outter_func);
|
|
||||||
// free(composite);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeDeclareFunction(Function * function) {
|
|
||||||
// Function * currFunc = function;
|
|
||||||
// free(function->name);
|
|
||||||
// Function * aux;
|
|
||||||
// while (currFunc != NULL) {
|
|
||||||
// switch (currFunc->type) {
|
|
||||||
// case EXPRESSION_FUNCTION:
|
|
||||||
// FreeExpression(currFunc->expression);
|
|
||||||
// break;
|
|
||||||
// case EXPRESSION_DOMAIN_FUNCTION:
|
|
||||||
// FreeExpression(currFunc->expression);
|
|
||||||
// FreeDomainForFunction(currFunc->domain);
|
|
||||||
// break;
|
|
||||||
// case COMPOSITE_FUNCTION:
|
|
||||||
// FreeCompositeFunction(currFunc->composite);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// LogError("Incorrect function definition");
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// aux = currFunc;
|
|
||||||
// currFunc = currFunc->next;
|
|
||||||
// free(aux);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeStatement(Statement * statement) {
|
|
||||||
// switch (statement->type) {
|
|
||||||
// case WHILE_STATEMENT:
|
|
||||||
// FreeWhile(statement->while_st);
|
|
||||||
// break;
|
|
||||||
// case FOR_STATEMENT:
|
|
||||||
// FreeFor(statement->for_st);
|
|
||||||
// break;
|
|
||||||
// case IF_STATEMENT:
|
|
||||||
// FreeIf(statement->if_st);
|
|
||||||
// break;
|
|
||||||
// case PRINT_STATEMENT:
|
|
||||||
// FreePrint(statement->print);
|
|
||||||
// break;
|
|
||||||
// case INTEGRATE_STATEMENT:
|
|
||||||
// FreeIntegrate(statement->integrate);
|
|
||||||
// break;
|
|
||||||
// case DERIVATIVE_STATEMENT:
|
|
||||||
// FreeDerivative(statement->derivative);
|
|
||||||
// break;
|
|
||||||
// case EVALUATE_STATEMENT:
|
|
||||||
// FreeEvaluate(statement->evaluate);
|
|
||||||
// break;
|
|
||||||
// case DECLARE_VARIABLE_STATEMENT:
|
|
||||||
// FreeDeclareVariable(statement->declareVariable);
|
|
||||||
// break;
|
|
||||||
// case ASSIGN_VARIABLE_STATEMENT:
|
|
||||||
// FreeAssignVariable(statement->assignVariable);
|
|
||||||
// break;
|
|
||||||
// case DECLARE_FUNCTION_STATEMENT:
|
|
||||||
// FreeDeclareFunction(statement->declareFunction);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// LogError("Invalid statement");
|
|
||||||
// abort();
|
|
||||||
// }
|
|
||||||
// free(statement);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void FreeTree(Program * program) {
|
|
||||||
// if (program == NULL)
|
|
||||||
// return;
|
|
||||||
// Statement * currStatement = program->statement, * aux;
|
|
||||||
// while (currStatement != NULL) {
|
|
||||||
// aux = currStatement;
|
|
||||||
// currStatement = currStatement->next;
|
|
||||||
// FreeStatement(aux);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
|
@ -3,19 +3,6 @@
|
||||||
|
|
||||||
#include "../support/nodes.h"
|
#include "../support/nodes.h"
|
||||||
|
|
||||||
void FreeTree(Program * program);
|
|
||||||
|
|
||||||
void FreeExpression(Expression * expression);
|
|
||||||
void FreeDomain(Domain * domain);
|
|
||||||
void FreeBoolean(Boolean * boolean);
|
|
||||||
void FreeIf(If * if_st);
|
|
||||||
void FreeDeclareVariable(Variable * variable);
|
|
||||||
void FreeAssignVariable(AssignVariable * variable);
|
|
||||||
void FreePrint(Print * print_st);
|
|
||||||
void FreeWhile(While * while_st);
|
|
||||||
void FreeStatement(Statement * statement);
|
|
||||||
void FreeBlock(Block * block);
|
|
||||||
|
|
||||||
#define DEFAULT_TABLE_SIZE 500
|
#define DEFAULT_TABLE_SIZE 500
|
||||||
|
|
||||||
typedef struct MallocTable {
|
typedef struct MallocTable {
|
||||||
|
@ -28,4 +15,4 @@ void InitializeMallocTable();
|
||||||
void AddMalloc(void * pointer);
|
void AddMalloc(void * pointer);
|
||||||
void FreeMallocTable();
|
void FreeMallocTable();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,4 +6,4 @@
|
||||||
|
|
||||||
bool Analyze(Program * program);
|
bool Analyze(Program * program);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,10 +2,6 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementación de "logger.h".
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Log(FILE * const stream, const char * prefix, const char * const format, const char * suffix, va_list arguments) {
|
void Log(FILE * const stream, const char * prefix, const char * const format, const char * suffix, va_list arguments) {
|
||||||
fprintf(stream, "%s", prefix);
|
fprintf(stream, "%s", prefix);
|
||||||
vfprintf(stream, format, arguments);
|
vfprintf(stream, format, arguments);
|
||||||
|
|
|
@ -68,7 +68,6 @@ typedef struct Expression {
|
||||||
|
|
||||||
struct Expression * leftExpression;
|
struct Expression * leftExpression;
|
||||||
struct Expression * rightExpression;
|
struct Expression * rightExpression;
|
||||||
// struct Variable * variable;
|
|
||||||
struct Derivative * derivative;
|
struct Derivative * derivative;
|
||||||
struct Integrate * integrate;
|
struct Integrate * integrate;
|
||||||
struct Evaluate * evaluate;
|
struct Evaluate * evaluate;
|
||||||
|
@ -168,7 +167,6 @@ typedef struct Derivative {
|
||||||
char * function;
|
char * function;
|
||||||
Expression * value;
|
Expression * value;
|
||||||
int * grade;
|
int * grade;
|
||||||
double * error;
|
|
||||||
} Derivative;
|
} Derivative;
|
||||||
|
|
||||||
typedef struct Evaluate {
|
typedef struct Evaluate {
|
||||||
|
@ -197,13 +195,6 @@ typedef struct Composite {
|
||||||
char * inner_func;
|
char * inner_func;
|
||||||
} Composite;
|
} Composite;
|
||||||
|
|
||||||
// typedef struct NumArray {
|
|
||||||
// Expression * expressions;
|
|
||||||
// size_t size;
|
|
||||||
|
|
||||||
// struct NumArray * next;
|
|
||||||
// } NumArray;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ADD_ASSIGN_EXPRESSION,
|
ADD_ASSIGN_EXPRESSION,
|
||||||
SUB_ASSIGN_EXPRESSION,
|
SUB_ASSIGN_EXPRESSION,
|
||||||
|
@ -220,4 +211,4 @@ typedef struct AssignVariable {
|
||||||
Expression * expression;
|
Expression * expression;
|
||||||
} AssignVariable;
|
} AssignVariable;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,20 +13,9 @@ extern void yyerror(const char * string);
|
||||||
extern int yylex(void);
|
extern int yylex(void);
|
||||||
extern int yyparse(void);
|
extern int yyparse(void);
|
||||||
|
|
||||||
// typedef enum {
|
|
||||||
// false = 0,
|
|
||||||
// true = 1
|
|
||||||
// } boolean;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool succeed;
|
bool succeed;
|
||||||
|
|
||||||
// Agregar una pila para almacenar tokens/nodos.
|
|
||||||
// Agregar un nodo hacia la raíz del árbol de sintaxis abstracta.
|
|
||||||
// Agregar una tabla de símbolos.
|
|
||||||
// ...
|
|
||||||
Program * program;
|
Program * program;
|
||||||
|
|
||||||
} CompilerState;
|
} CompilerState;
|
||||||
|
|
||||||
extern CompilerState state;
|
extern CompilerState state;
|
||||||
|
|
|
@ -4,62 +4,6 @@
|
||||||
#include "../../backend/support/shared.h"
|
#include "../../backend/support/shared.h"
|
||||||
#include "../syntactic-analysis/bison-parser.h"
|
#include "../syntactic-analysis/bison-parser.h"
|
||||||
|
|
||||||
// typedef enum TokenID {
|
|
||||||
// UNKNOWN = 0,
|
|
||||||
// YYUNDEF = 257,
|
|
||||||
// ADD,
|
|
||||||
// SUB,
|
|
||||||
// MUL,
|
|
||||||
// DIV,
|
|
||||||
// POW,
|
|
||||||
// FUNCTION,
|
|
||||||
// IF,
|
|
||||||
// ELSE,
|
|
||||||
// FOR,
|
|
||||||
// WHILE,
|
|
||||||
// PRINT,
|
|
||||||
// SEMICOLON,
|
|
||||||
// COMPOSITE,
|
|
||||||
// SQUOTE,
|
|
||||||
// DERIVATIVE,
|
|
||||||
// INTEGRATE,
|
|
||||||
// BETWEEN,
|
|
||||||
// AND_INT,
|
|
||||||
// EVALUATE,
|
|
||||||
// IN,
|
|
||||||
// OPEN_BRACES,
|
|
||||||
// OPEN_BRACKETS,
|
|
||||||
// CLOSE_BRACES,
|
|
||||||
// CLOSE_BRACKETS,
|
|
||||||
// OPEN_PARENTHESIS,
|
|
||||||
// CLOSE_PARENTHESIS,
|
|
||||||
// ASSIGN,
|
|
||||||
// EQUAL,
|
|
||||||
// AND,
|
|
||||||
// OR,
|
|
||||||
// NOT,
|
|
||||||
// ADD_ASSIGN,
|
|
||||||
// INCREMENT,
|
|
||||||
// SUB_ASSIGN,
|
|
||||||
// DECREMENT,
|
|
||||||
// MUL_ASSIGN,
|
|
||||||
// DIV_ASSIGN,
|
|
||||||
// DQUOTE,
|
|
||||||
// COMMA,
|
|
||||||
// COLON,
|
|
||||||
// LESSER,
|
|
||||||
// LESSER_EQUAL,
|
|
||||||
// GREATER,
|
|
||||||
// GREATER_EQUAL,
|
|
||||||
// NOT_EQUAL,
|
|
||||||
// VAR,
|
|
||||||
// ERR,
|
|
||||||
// ESCAPESTRING,
|
|
||||||
// DOUBLE,
|
|
||||||
// INTEGER,
|
|
||||||
// ID
|
|
||||||
// } TokenID;
|
|
||||||
|
|
||||||
int IntegerPatternAction(const char * lexeme);
|
int IntegerPatternAction(const char * lexeme);
|
||||||
int DoublePatternAction(const char * lexeme);
|
int DoublePatternAction(const char * lexeme);
|
||||||
void IgnoredPatternAction();
|
void IgnoredPatternAction();
|
||||||
|
|
|
@ -552,7 +552,6 @@ Print * PrintStringGrammarAction(char * string) {
|
||||||
print->type = STRING_PRINT;
|
print->type = STRING_PRINT;
|
||||||
print->string = malloc(strlen(string) + 1);
|
print->string = malloc(strlen(string) + 1);
|
||||||
strcpy(print->string, string);
|
strcpy(print->string, string);
|
||||||
// free(string);
|
|
||||||
print->expression = NULL;
|
print->expression = NULL;
|
||||||
AddMalloc(print->string);
|
AddMalloc(print->string);
|
||||||
AddMalloc(print);
|
AddMalloc(print);
|
||||||
|
@ -653,17 +652,6 @@ Derivative * GradedDerivativeGrammarAction(int grade, char * id, Expression * ex
|
||||||
return derivative;
|
return derivative;
|
||||||
}
|
}
|
||||||
|
|
||||||
Derivative * ErroredDerivativeGrammarAction(Derivative * derivative, double error) {
|
|
||||||
if (derivative->error != 0) {
|
|
||||||
yyerror("ERR operand appears more than once");
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
derivative->error = malloc(sizeof(double));
|
|
||||||
AddMalloc(derivative->error);
|
|
||||||
*derivative->error = error;
|
|
||||||
return derivative;
|
|
||||||
}
|
|
||||||
|
|
||||||
// INTEGRATE
|
// INTEGRATE
|
||||||
|
|
||||||
Integrate * IntegrateGrammarAction(char * id, Expression * lExp, Expression * rExp) {
|
Integrate * IntegrateGrammarAction(char * id, Expression * lExp, Expression * rExp) {
|
||||||
|
@ -681,7 +669,8 @@ Integrate * IntegrateGrammarAction(char * id, Expression * lExp, Expression * rE
|
||||||
Integrate * ErroredIntegrateGrammarAction(Integrate * integrate, double error) {
|
Integrate * ErroredIntegrateGrammarAction(Integrate * integrate, double error) {
|
||||||
if (integrate->error != 0) {
|
if (integrate->error != 0) {
|
||||||
yyerror("ERR operand appears more than once");
|
yyerror("ERR operand appears more than once");
|
||||||
abort();
|
FreeMallocTable();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
integrate->error = malloc(sizeof(double));
|
integrate->error = malloc(sizeof(double));
|
||||||
AddMalloc(integrate->error);
|
AddMalloc(integrate->error);
|
||||||
|
@ -809,7 +798,6 @@ char * EscapedStringGrammarAction(char * str) {
|
||||||
char * string = malloc(strlen(str) + 1);
|
char * string = malloc(strlen(str) + 1);
|
||||||
AddMalloc(string);
|
AddMalloc(string);
|
||||||
strcpy(string, str);
|
strcpy(string, str);
|
||||||
// free(str);
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -819,7 +807,5 @@ char * EscapedStringsGrammarAction(char * str1, char * str2) {
|
||||||
string[0] = 0;
|
string[0] = 0;
|
||||||
strcat(string, str1);
|
strcat(string, str1);
|
||||||
strcat(string, str2);
|
strcat(string, str2);
|
||||||
// free(str1);
|
|
||||||
// free(str2);
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,6 @@ For * ForBlockNoVarGrammarAction(Boolean * boolean, AssignVariable * action_vari
|
||||||
Block * BlockGrammarAction(Statement * statement);
|
Block * BlockGrammarAction(Statement * statement);
|
||||||
Derivative * SimpleDerivativeGrammarAction(char * id, Expression * expression);
|
Derivative * SimpleDerivativeGrammarAction(char * id, Expression * expression);
|
||||||
Derivative * GradedDerivativeGrammarAction(int grade, char * id, Expression * expression);
|
Derivative * GradedDerivativeGrammarAction(int grade, char * id, Expression * expression);
|
||||||
Derivative * ErroredDerivativeGrammarAction(Derivative * derivative, double error);
|
|
||||||
Integrate * IntegrateGrammarAction(char * id, Expression * lExp, Expression * rExp);
|
Integrate * IntegrateGrammarAction(char * id, Expression * lExp, Expression * rExp);
|
||||||
Integrate * ErroredIntegrateGrammarAction(Integrate * integrate, double error);
|
Integrate * ErroredIntegrateGrammarAction(Integrate * integrate, double error);
|
||||||
Evaluate * EvaluateGrammarAction(char * id, Expression * expression);
|
Evaluate * EvaluateGrammarAction(char * id, Expression * expression);
|
||||||
|
|
|
@ -204,7 +204,6 @@ statements: statement
|
||||||
|
|
||||||
derivative: DERIVATIVE ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = SimpleDerivativeGrammarAction($2, $5); }
|
derivative: DERIVATIVE ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = SimpleDerivativeGrammarAction($2, $5); }
|
||||||
| DERIVATIVE INTEGER ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = GradedDerivativeGrammarAction($2, $3, $6); }
|
| DERIVATIVE INTEGER ID IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = GradedDerivativeGrammarAction($2, $3, $6); }
|
||||||
| derivative ERR positive_constant { $$ = ErroredDerivativeGrammarAction($1, $3); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
block: OPEN_BRACES statements CLOSE_BRACES { $$ = BlockGrammarAction($2); }
|
block: OPEN_BRACES statements CLOSE_BRACES { $$ = BlockGrammarAction($2); }
|
||||||
|
|
Loading…
Reference in New Issue