diff --git a/doc/examples/use-case-1.txt b/doc/examples/use-case-1.txt index c9d06d5..edf5d7a 100644 --- a/doc/examples/use-case-1.txt +++ b/doc/examples/use-case-1.txt @@ -5,8 +5,8 @@ function g = { x - 2: x < 3, }; fun h = x/(x-2); -evaluate f in 3; +evaluate f in (3); g(5); -evaluate g in 4; +evaluate g in (4); g(2); h(2); \ No newline at end of file diff --git a/doc/examples/use-case-14.txt b/doc/examples/use-case-14.txt index 1d7f40f..719932c 100644 --- a/doc/examples/use-case-14.txt +++ b/doc/examples/use-case-14.txt @@ -1,2 +1,2 @@ fun f = 1/x; -derivative f in 3 err -2; \ No newline at end of file +derivative f in (3) err -2; \ No newline at end of file diff --git a/doc/examples/use-case-5.txt b/doc/examples/use-case-5.txt index 760dedb..d8578c3 100644 --- a/doc/examples/use-case-5.txt +++ b/doc/examples/use-case-5.txt @@ -1,6 +1,6 @@ fun f = x^2; -derivative f in 3; -derivative 2 f in 3; -derivative 3 f in 3; -derivative 4 f in 3; -derivative 5 f in 3; \ No newline at end of file +derivative f in (3); +derivative 2 f in (3); +derivative 3 f in (3); +derivative 4 f in (3); +derivative 5 f in (3); \ No newline at end of file diff --git a/doc/examples/use-case-7.txt b/doc/examples/use-case-7.txt index 01f6d6e..fae0232 100644 --- a/doc/examples/use-case-7.txt +++ b/doc/examples/use-case-7.txt @@ -2,4 +2,4 @@ fun f = - x^2 / 2 + 5*x; fun g = x^2 - 5*x - 2; fun h = x^2 - 5*x - 82; -integrate [f, g, h] between 2 ~ 7; \ No newline at end of file +integrate [f, g, h] between (2 ~ 7); \ No newline at end of file diff --git a/doc/examples/use-case-8.txt b/doc/examples/use-case-8.txt index 74665dd..ee36fd6 100644 --- a/doc/examples/use-case-8.txt +++ b/doc/examples/use-case-8.txt @@ -1 +1,2 @@ -fun f = f(3) * x * 4 + 3; \ No newline at end of file +fun f = f(3) * x * 4 + 3; +fun g = f(3) + f'(3)*(x-3) + f''(3)/2 * (x-3)^2 + f'''(3) / 6 * (x-3)^3 + f''''(3) / 24 * (x-3)^4; \ No newline at end of file diff --git a/doc/examples/use-case-9.txt b/doc/examples/use-case-9.txt index d5e2324..9d8dcfa 100644 --- a/doc/examples/use-case-9.txt +++ b/doc/examples/use-case-9.txt @@ -1,4 +1,4 @@ fun f = x^2; -var a = int f 0 ~ 5; -var b = int f 0 ~ 1 + int f 1 ~ 2 + int f 2 ~ 3 + int f 3 ~ 4 + int f 4 ~ 5; +var a = int f (0 ~ 5); +var b = int f (0 ~ 1) + int f (1 ~ 2) + int f (2 ~ 3) + int f (3 ~ 4) + int f (4 ~ 5); var c = a - b; \ No newline at end of file diff --git a/src/frontend/lexical-analysis/flex-actions.h b/src/frontend/lexical-analysis/flex-actions.h index a0ae637..7cca08e 100644 --- a/src/frontend/lexical-analysis/flex-actions.h +++ b/src/frontend/lexical-analysis/flex-actions.h @@ -62,7 +62,7 @@ typedef enum TokenID { LESSER_EQUAL, GREATER, GREATER_EQUAL, - COMPARE, + NOT_EQUAL, VAR, ERR, TAYLOR, diff --git a/src/frontend/lexical-analysis/flex-patterns.l b/src/frontend/lexical-analysis/flex-patterns.l index ec63843..f5a65cf 100644 --- a/src/frontend/lexical-analysis/flex-patterns.l +++ b/src/frontend/lexical-analysis/flex-patterns.l @@ -20,7 +20,6 @@ char [a-zA-Z] characters [a-zA-Z., ] decimal [.] endline \n -/* whitespace [\f\n\r\t\v\0 ] */ whitespace [ \f\n\r\t\v] %% @@ -54,6 +53,7 @@ whitespace [ \f\n\r\t\v] "<=" { return LESSER_EQUAL; } ">" { return GREATER; } ">=" { return GREATER_EQUAL; } +"!=" { return NOT_EQUAL; } "in" { return IN; } "{" { return OPEN_BRACES; } "}" { return CLOSE_BRACES; } diff --git a/src/frontend/syntactic-analysis/bison-actions.c b/src/frontend/syntactic-analysis/bison-actions.c index 8b10194..f842c11 100644 --- a/src/frontend/syntactic-analysis/bison-actions.c +++ b/src/frontend/syntactic-analysis/bison-actions.c @@ -10,13 +10,13 @@ void yyerror(const char * string) { LogError("Mensaje: '%s' debido a '%s' (linea %d).", string, yytext, yylineno); - LogError("En ASCII es:"); - LogErrorRaw("\t"); - const int length = strlen(yytext); - for (int i = 0; i < length; ++i) { - LogErrorRaw("[%d]", yytext[i]); - } - LogErrorRaw("\n\n"); + // LogError("En ASCII es:"); + // LogErrorRaw("\t"); + // const int length = strlen(yytext); + // for (int i = 0; i < length; ++i) { + // LogErrorRaw("[%d]", yytext[i]); + // } + // LogErrorRaw("\n\n"); } int ProgramGrammarAction(const int value) { diff --git a/src/frontend/syntactic-analysis/bison-grammar.y b/src/frontend/syntactic-analysis/bison-grammar.y index 2637de0..5a5b518 100644 --- a/src/frontend/syntactic-analysis/bison-grammar.y +++ b/src/frontend/syntactic-analysis/bison-grammar.y @@ -50,7 +50,7 @@ %token LESSER_EQUAL %token GREATER %token GREATER_EQUAL -%token COMPARE +%token NOT_EQUAL %token VAR %token ERR %token TAYLOR @@ -61,8 +61,9 @@ %token STRING // Reglas de asociatividad y precedencia (de menor a mayor): -%left ADD SUB -%left MUL DIV +%left GREATER GREATER_EQUAL LESSER LESSER_EQUAL EQUAL NOT_EQUAL +%left ADD SUB NOT +%left MUL DIV AND OR %left POW %% @@ -70,50 +71,60 @@ program: statements { $$ = ProgramGrammarAction($1); } ; -expression: constant +statement: evaluate SEMICOLON + | integrate SEMICOLON + | derivative SEMICOLON + | declare_function SEMICOLON + | if_statement + | ifelse_statement + | for_statement + | while_statement + | printCSV SEMICOLON + | print SEMICOLON + | declare_variable SEMICOLON + | assign_variable SEMICOLON + ; + +expression: positive_constant | evaluate | integrate | derivative | STRING - | expression ADD expression - | expression SUB expression + | expression ADD expression + | expression SUB expression | expression MUL expression | expression DIV expression | expression POW expression | OPEN_PARENTHESIS expression CLOSE_PARENTHESIS | SUB expression - | number ; -domain: STRING LESSER number - | STRING LESSER_EQUAL number - | STRING GREATER number - | STRING GREATER_EQUAL number - | STRING EQUAL number - | number LESSER STRING - | number LESSER_EQUAL STRING - | number GREATER STRING - | number GREATER_EQUAL STRING - | number EQUAL STRING - | number LESSER STRING LESSER number - | number LESSER_EQUAL STRING LESSER number - | number LESSER STRING LESSER_EQUAL number - | number LESSER_EQUAL STRING LESSER_EQUAL number +domain: expression LESSER expression + | expression LESSER_EQUAL expression + | expression GREATER expression + | expression GREATER_EQUAL expression + | expression EQUAL expression + | expression NOT_EQUAL expression + | expression LESSER expression LESSER expression + | expression LESSER_EQUAL expression LESSER expression + | expression LESSER expression LESSER_EQUAL expression + | expression LESSER_EQUAL expression LESSER_EQUAL expression ; -boolean: number LESSER number - | number LESSER_EQUAL number - | number GREATER number - | number GREATER_EQUAL number - | number EQUAL number +boolean: expression LESSER expression + | expression LESSER_EQUAL expression + | expression GREATER expression + | expression GREATER_EQUAL expression + | expression EQUAL expression + | expression NOT_EQUAL expression | boolean OR boolean | boolean AND boolean + | OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS | NOT boolean ; -constant: DOUBLE +positive_constant: DOUBLE | INTEGER - | SUB constant ; declare_function: FUNCTION STRING ASSIGN function @@ -134,15 +145,15 @@ composite: STRING COMPOSITE STRING | composite COMPOSITE STRING ; -numbers: number - | number COMMA numbers +expressions: expression + | expression COMMA expressions ; strings: STRING | STRING COMMA strings ; -numArray: OPEN_BRACKETS numbers CLOSE_BRACKETS +numArray: OPEN_BRACKETS expressions CLOSE_BRACKETS ; numArrays: numArray @@ -166,41 +177,26 @@ escapeStrings: escapeString escapeStringArray: OPEN_BRACKETS escapeStrings CLOSE_BRACKETS ; -evaluate: EVALUATE STRING IN number +evaluate: EVALUATE STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS | EVALUATE STRING IN numArray - | STRING OPEN_PARENTHESIS number CLOSE_PARENTHESIS - | EVALUATE stringArray IN number + | STRING OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | EVALUATE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS | EVALUATE stringArray IN numArray - | stringArray OPEN_PARENTHESIS number CLOSE_PARENTHESIS + | stringArray OPEN_PARENTHESIS expression CLOSE_PARENTHESIS ; -integrate: INTEGRATE STRING BETWEEN number AND_INT number - | INTEGRATE STRING number AND_INT number - | INTEGRATE stringArray BETWEEN number AND_INT number - | INTEGRATE stringArray number AND_INT number - | integrate ERR constant +integrate: INTEGRATE STRING BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | INTEGRATE STRING OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | INTEGRATE stringArray BETWEEN OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | INTEGRATE stringArray OPEN_PARENTHESIS expression AND_INT expression CLOSE_PARENTHESIS + | integrate ERR positive_constant ; squotes: SQUOTE | SQUOTE squotes ; -statement: evaluate SEMICOLON - | integrate SEMICOLON - | derivative SEMICOLON - | declare_function SEMICOLON - | if_statement - | ifelse_statement - | for_statement - | while_statement - | printCSV SEMICOLON - | print SEMICOLON - | declare_variable SEMICOLON - | assign_variable SEMICOLON - ; - -print: PRINT OPEN_PARENTHESIS number CLOSE_PARENTHESIS - | PRINT OPEN_PARENTHESIS STRING CLOSE_PARENTHESIS +print: PRINT OPEN_PARENTHESIS expression CLOSE_PARENTHESIS | PRINT OPEN_PARENTHESIS escapeString CLOSE_PARENTHESIS ; @@ -208,13 +204,13 @@ statements: statement | statement statements ; -derivative: DERIVATIVE STRING IN constant - | DERIVATIVE INTEGER STRING IN constant - | STRING squotes OPEN_PARENTHESIS constant CLOSE_PARENTHESIS - | DERIVATIVE stringArray IN constant - | DERIVATIVE INTEGER stringArray IN constant - | stringArray squotes OPEN_PARENTHESIS constant CLOSE_PARENTHESIS - | derivative ERR constant +derivative: DERIVATIVE STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | DERIVATIVE INTEGER STRING IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | STRING squotes OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | DERIVATIVE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | DERIVATIVE INTEGER stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | stringArray squotes OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + | derivative ERR positive_constant ; if_statement: IF OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS @@ -245,23 +241,23 @@ declare_variable: VAR STRING printCSV: PRINTCSV OPEN_PARENTHESIS escapeStringArray COMMA arrayNumArray COMMA escapeString CLOSE_PARENTHESIS ; -number: constant +/* expression: positive_constant | evaluate | integrate | derivative - | number ADD number - | number DIV number - | number SUB number - | number POW number - | number MUL number - | SUB number - | OPEN_PARENTHESIS number CLOSE_PARENTHESIS - ; + | expression ADD expression + | expression DIV expression + | expression SUB expression + | expression POW expression + | expression MUL expression + | SUB expression + | OPEN_PARENTHESIS expression CLOSE_PARENTHESIS + ; */ -assign_variable: STRING ADD_ASSIGN number - | STRING SUB_ASSIGN number - | STRING MUL_ASSIGN number - | STRING DIV_ASSIGN number +assign_variable: STRING ADD_ASSIGN expression + | STRING SUB_ASSIGN expression + | STRING MUL_ASSIGN expression + | STRING DIV_ASSIGN expression | STRING INCREMENT | STRING DECREMENT | STRING ASSIGN expression diff --git a/src/main.c b/src/main.c index 85e8f3d..2fc7882 100644 --- a/src/main.c +++ b/src/main.c @@ -13,6 +13,7 @@ const int main(const int argumentCount, const char ** arguments) { // #ifdef YYDEBUG // yydebug = 1; // #endif + // Inicializar estado de la aplicación. state.result = 0; state.succeed = false;