%{ #include #include #include #include "parser/parser.c" #include "functions/functions.c" #include "logic/logic.c" #include "print/print.c" #include "includes/include.h" int yylex(void); void yyerror(char *); extern int yylineno; extern int _DEBUG; //hashmaps/link list heads map_void_t *_var_map = NULL; node_info *_temp_statement_head = NULL; //struct variable *_var_head = NULL; map_void_t *_function_list = NULL; %} /* doing these before multiplication and division because they have a lower presidence */ %left '<' '>' %left '+' '-' /* doing this last so they have a higher presidence */ %left '*' '/' '%' %union { char *str; int num; char character; double Double; struct node_info *nPtr; } %token INCREASE DECREASE PRINTF IF END KEYWORD_S KEYWORD_I KEYWORD_C QUOTE ELSE WHILE DEF CALL %token INTEGER %token STRING VARNAME %token CHAR %token DOUBLEVAR %type expr %type statement print VARIABLE FUNC statement_list %% program: main '\n' | ; main: main FUNC ';' { if (_DEBUG == 1 ) { printf(">>> "); ex($2); } else { ex($2); } } | FUNC ';' { if (_DEBUG == 1 ) { printf(">>> "); ex($1); } else { ex($1); } } | statement ';' { if (_DEBUG == 1 ) { printf(">>> "); ex($1); } else { ex($1); } } ; statement: VARIABLE { $$ = $1; } //this is a real var dec. | FUNC { $$ = $1; } | IF '[' expr ']' ':' '{' statement_list '}' { $$ = create_logic(1, $3, $7, NULL); } //examples of logic in this language | WHILE '[' expr ']' ':' '{' statement_list '}' { $$ = create_logic(2, $3, $7, NULL); } | PRINTF'['print']' { $$ = $3; } | '{' statement_list '}' { $$ = $2; } ; statement_list: statement ';' { $$ = create_compound_statement($1, _temp_statement_head); } | statement_list statement ';' { $$ = add_to_compound_statement($2, $1); } ; FUNC: DEF VARNAME ':' '{' statement_list '}' { $$ = create_function($2, $5); } // defining functions | CALL VARNAME { $$ = create_function_call($2); } // calling functions ; VARIABLE: VARNAME '=' STRING { $$ = create_var_assignment_string($1, $3);} | VARNAME '=' expr { $$ = create_var_assignment_int($1, $3);} | VARNAME '=' CHAR { $$ = create_var_assignment_char($1, $3);} | VARNAME '=' DOUBLEVAR { $$ = create_var_assignment_double($1, $3);} | VARNAME '=' '{' statement_list '}' { $$ = create_function($1, $4); } // you can also define functions like this ; expr: INTEGER { $$ = $1; } | '{' KEYWORD_I '}' VARNAME { $$ = get_value($4, _var_map)->_int; } | expr '+' expr { $$ = $1 + $3; } /* addition */ | expr '-' expr { $$ = $1 - $3; } /* subtration */ | expr '*' expr { $$ = $1 * $3; } /* multiplication */ | expr '/' expr { $$ = $1 / $3; } /* division */ | expr '%' expr { $$ = $1 % $3; } | expr '>' expr { if ($1 > $3) { $$ = 1; } else { $$ = 0;}} | expr '<' expr { if ($1 < $3) { $$ = 1; } else { $$ = 0;}} | '(' expr ')' { $$ = $2; } ; //TODO update this. print: VARNAME { $$ = create_print_var_node($1); } | expr { $$ = create_print_statement(1, $1, NULL); } | STRING { $$ = create_print_statement(2, 0, $1); } | ',' print { $$ = $2; } ; %% void yyerror(char *s) { fprintf(stderr, "Error on line %d, %s\n", yylineno, s); }