bfbcompiler/src/frontend/syntactic-analysis/bison-grammar.y

258 lines
6.5 KiB
Plaintext

%{
#include "bison-actions.h"
%}
// IDs de los tokens generados desde Flex:
%token ADD
%token SUB
%token MUL
%token DIV
%token POW
%token FUNCTION
%token IF
%token ELSE
%token FOR
%token WHILE
%token PRINT
%token SEMICOLON
%token COMPOSITE
%token SQUOTE
%token DERIVATIVE
%token INTEGRATE
%token BETWEEN
%token AND_INT
%token EVALUATE
%token IN
%token OPEN_BRACES
%token OPEN_BRACKETS
%token CLOSE_BRACES
%token CLOSE_BRACKETS
%token OPEN_PARENTHESIS
%token CLOSE_PARENTHESIS
%token ASSIGN
%token EQUAL
%token AND
%token OR
%token NOT
%token ADD_ASSIGN
%token INCREMENT
%token SUB_ASSIGN
%token DECREMENT
%token MUL_ASSIGN
%token DIV_ASSIGN
%token DQUOTE
%token COMMA
%token COLON
%token LESSER
%token LESSER_EQUAL
%token GREATER
%token GREATER_EQUAL
%token NOT_EQUAL
%token VAR
%token ERR
%token TAYLOR
%token ESCAPESTRING
%token PRINTCSV
%token DOUBLE
%token INTEGER
%token STRING
// Reglas de asociatividad y precedencia (de menor a mayor):
%precedence CLOSE_PARENTHESIS
%precedence ELSE
%left GREATER GREATER_EQUAL LESSER LESSER_EQUAL EQUAL NOT_EQUAL
%left ADD SUB NOT
%left MUL DIV AND OR
%left POW
%%
program: statements { $$ = ProgramGrammarAction($1); }
;
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 MUL expression
| expression DIV expression
| expression POW expression
| OPEN_PARENTHESIS expression CLOSE_PARENTHESIS
| SUB expression
;
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: 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
;
positive_constant: DOUBLE
| INTEGER
;
declare_function: FUNCTION STRING ASSIGN function
| FUNCTION STRING ASSIGN OPEN_BRACES functions CLOSE_BRACES
;
function: expression
| expression COLON domain
| composite
| taylor
;
functions: function
| function COMMA functions
;
composite: STRING COMPOSITE STRING
| composite COMPOSITE STRING
;
expressions: expression
| expression COMMA expressions
;
strings: STRING
| STRING COMMA strings
;
numArray: OPEN_BRACKETS expressions CLOSE_BRACKETS
;
numArrays: numArray
| numArray COMMA numArrays
;
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 OPEN_PARENTHESIS expression CLOSE_PARENTHESIS
| EVALUATE STRING IN numArray
| STRING OPEN_PARENTHESIS expression CLOSE_PARENTHESIS
| EVALUATE stringArray IN OPEN_PARENTHESIS expression CLOSE_PARENTHESIS
| EVALUATE stringArray IN numArray
| stringArray OPEN_PARENTHESIS expression CLOSE_PARENTHESIS
;
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
;
print: PRINT OPEN_PARENTHESIS expression CLOSE_PARENTHESIS
| PRINT OPEN_PARENTHESIS escapeString CLOSE_PARENTHESIS
;
statements: statement
| statement statements
;
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 statement
| IF OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS
;
ifelse_statement: if_statement ELSE statement
| if_statement ELSE OPEN_BRACKETS statements CLOSE_BRACKETS
;
for_statement: FOR OPEN_PARENTHESIS declare_variable SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS OPEN_BRACES statements CLOSE_BRACES
| FOR OPEN_PARENTHESIS SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS OPEN_BRACES statements CLOSE_BRACES
| FOR OPEN_PARENTHESIS declare_variable SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS statement
| FOR OPEN_PARENTHESIS SEMICOLON boolean SEMICOLON assign_variable CLOSE_PARENTHESIS statement
;
taylor: TAYLOR INTEGER STRING
;
while_statement: WHILE OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS OPEN_BRACKETS statements CLOSE_BRACKETS
| WHILE OPEN_PARENTHESIS boolean CLOSE_PARENTHESIS statement
;
declare_variable: VAR STRING
| declare_variable ASSIGN expression
;
printCSV: PRINTCSV OPEN_PARENTHESIS escapeStringArray COMMA arrayNumArray COMMA escapeString CLOSE_PARENTHESIS
;
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
;
%%