diff --git a/doc/examples/use-case-10.txt b/doc/examples/use-case-10.txt index 9ff4c12..bd93c97 100644 --- a/doc/examples/use-case-10.txt +++ b/doc/examples/use-case-10.txt @@ -1,3 +1,2 @@ fun f = 1/x; -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; -taylor 5 f; \ No newline at end of file +fun g = taylor 5 f; \ No newline at end of file diff --git a/doc/examples/use-case-3.txt b/doc/examples/use-case-3.txt index 88df750..be2808c 100644 --- a/doc/examples/use-case-3.txt +++ b/doc/examples/use-case-3.txt @@ -1,4 +1,5 @@ +fun g = (1-x)^(x); +fun f = x^2; fun h = x/(x-2); -fun g = hohohoh; -printCsv g(1) -printCsv g(1) \ No newline at end of file +fun j = 1/x; +printCSV(["g", "f", "h", "j"], [[g(1), f(1), h(1) , j(1), gofohoj(1)]], "example.csv"); \ No newline at end of file diff --git a/doc/examples/use-case-8.txt b/doc/examples/use-case-8.txt index 3b3a220..74665dd 100644 --- a/doc/examples/use-case-8.txt +++ b/doc/examples/use-case-8.txt @@ -1 +1 @@ -var x = f(3) * x * 4 + 3; \ No newline at end of file +fun f = f(3) * x * 4 + 3; \ 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 e0453b3..a0ae637 100644 --- a/src/frontend/lexical-analysis/flex-actions.h +++ b/src/frontend/lexical-analysis/flex-actions.h @@ -67,6 +67,7 @@ typedef enum TokenID { ERR, TAYLOR, ESCAPESTRING, + PRINTCSV, DOUBLE, INTEGER, STRING diff --git a/src/frontend/lexical-analysis/flex-patterns.l b/src/frontend/lexical-analysis/flex-patterns.l index 81f3b71..ec63843 100644 --- a/src/frontend/lexical-analysis/flex-patterns.l +++ b/src/frontend/lexical-analysis/flex-patterns.l @@ -17,6 +17,7 @@ crlf \r\n digit [0-9] char [a-zA-Z] +characters [a-zA-Z., ] decimal [.] endline \n /* whitespace [\f\n\r\t\v\0 ] */ @@ -75,6 +76,7 @@ whitespace [ \f\n\r\t\v] "var" { return VAR; } "err" { return ERR; } "taylor" { return TAYLOR; } +"printCSV" { return PRINTCSV; } {digit}+{decimal}{digit}+ { return DoublePatternAction(yytext); } @@ -83,7 +85,7 @@ whitespace [ \f\n\r\t\v] {char}+ { return StringPatternAction(yytext); } -\"{char}+\" { return EscapeStringPatternAction(yytext); } +\"{characters}+\" { return EscapeStringPatternAction(yytext); } {whitespace} { IgnoredPatternAction(yytext); } diff --git a/src/frontend/syntactic-analysis/bison-grammar.y b/src/frontend/syntactic-analysis/bison-grammar.y index e245492..39e540c 100644 --- a/src/frontend/syntactic-analysis/bison-grammar.y +++ b/src/frontend/syntactic-analysis/bison-grammar.y @@ -55,6 +55,7 @@ %token ERR %token TAYLOR %token ESCAPESTRING +%token PRINTCSV %token DOUBLE %token INTEGER %token STRING @@ -66,31 +67,34 @@ %% -program: statements // { $$ = ProgramGrammarAction($1); } +program: statements ; expression: constant + | evaluate + | integrate + | derivative | STRING - | expression ADD expression // { $$ = AdditionExpressionGrammarAction($1, $3); } - | expression SUB expression // { $$ = SubtractionExpressionGrammarAction($1, $3); } - | expression MUL expression // { $$ = MultiplicationExpressionGrammarAction($1, $3); } - | expression DIV expression // { $$ = DivisionExpressionGrammarAction($1, $3); } - | expression POW expression // { $$ = PowerExpressionGrammarAction($1, $3); } + | 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 // { $$ = LesserExpressionGrammarAction($1, $3); } - | STRING LESSER_EQUAL number // { $$ = LesserEqualExpressionGrammarAction($1, $3); } - | STRING GREATER number // { $$ = GreaterExpressionGrammarAction($1, $3); } - | STRING GREATER_EQUAL number // { $$ = GreaterEqualExpressionGrammarAction($1, $3); } - | STRING EQUAL number // { $$ = EqualExpressionGrammarAction($1, $3); } - | number LESSER STRING // { $$ = LesserExpressionGrammarAction($1, $3); } - | number LESSER_EQUAL STRING // { $$ = LesserEqualExpressionGrammarAction($1, $3); } - | number GREATER STRING // { $$ = GreaterExpressionGrammarAction($1, $3); } - | number GREATER_EQUAL STRING // { $$ = GreaterEqualExpressionGrammarAction($1, $3); } - | number EQUAL STRING // { $$ = EqualExpressionGrammarAction($1, $3); } +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 @@ -136,19 +140,38 @@ numbers: number strings: STRING | STRING COMMA strings + ; numArray: OPEN_BRACKETS numbers CLOSE_BRACKETS ; -stringArray: OPEN_BRACKETS strings CLOSE_BRACKETS +numArrays: numArray + | numArray COMMA numArrays ; -evaluate: EVALUATE STRING IN number //{ $$ = IntegerConstantGrammarAction($1); } - | EVALUATE STRING IN numArray //{ $$ = IntegerConstantGrammarAction($1); } - | STRING OPEN_PARENTHESIS number CLOSE_PARENTHESIS //{ $$ = IntegerConstantGrammarAction($1); } - | EVALUATE stringArray IN number //{ $$ = IntegerConstantGrammarAction($1); } - | EVALUATE stringArray IN numArray //{ $$ = IntegerConstantGrammarAction($1); } - | stringArray OPEN_PARENTHESIS number CLOSE_PARENTHESIS //{ $$ = IntegerConstantGrammarAction($1); } +arrayNumArray: OPEN_BRACKETS numArrays CLOSE_BRACKETS + ; + +stringArray: OPEN_BRACKETS strings CLOSE_BRACKETS + ; + +escapeString: ESCAPESTRING + | ESCAPESTRING ADD escapeString + ; + +escapeStrings: escapeString + | escapeString COMMA escapeStrings + ; + +escapeStringArray: OPEN_BRACKETS escapeStrings CLOSE_BRACKETS + ; + +evaluate: EVALUATE STRING IN number + | EVALUATE STRING IN numArray + | STRING OPEN_PARENTHESIS number CLOSE_PARENTHESIS + | EVALUATE stringArray IN number + | EVALUATE stringArray IN numArray + | stringArray OPEN_PARENTHESIS number CLOSE_PARENTHESIS ; integrate: INTEGRATE STRING BETWEEN number AND_INT number @@ -170,6 +193,7 @@ statement: evaluate SEMICOLON | ifelse_statement | for_statement | while_statement + | printCSV SEMICOLON | print SEMICOLON | declare_variable SEMICOLON | assign_variable SEMICOLON @@ -177,11 +201,7 @@ statement: evaluate SEMICOLON print: PRINT OPEN_PARENTHESIS number CLOSE_PARENTHESIS | PRINT OPEN_PARENTHESIS STRING CLOSE_PARENTHESIS - | PRINT OPEN_PARENTHESIS escapedString CLOSE_PARENTHESIS - ; - -escapedString: ESCAPESTRING - | ESCAPESTRING ADD escapedString + | PRINT OPEN_PARENTHESIS escapeString CLOSE_PARENTHESIS ; statements: statement @@ -219,14 +239,16 @@ while_statement: WHILE OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS OPEN_BRACKETS ; declare_variable: VAR STRING - | VAR STRING ASSIGN number | VAR STRING ASSIGN expression - ; + ; -number: evaluate +printCSV: PRINTCSV OPEN_PARENTHESIS escapeStringArray COMMA arrayNumArray COMMA escapeString CLOSE_PARENTHESIS + ; + +number: constant + | evaluate | integrate | derivative - | constant | number ADD number | number DIV number | number SUB number