/* Syntax Analyzer with Bison (3.8.1) */ /* (referenced Bison manual for file boilerplate [3.1]) */ // Prologue %{ #include #include "symbol_table.c" extern int yylex(void); void yyerror(const char *err); extern char* yytext; extern int yychar; SymbolTable * st; //char* cur_value; //char* cur_type; int token_tracker; extern int line_number; extern int column_number; %} %union { int integ; char * words; } //precedence order %precedence RESERVE %precedence RELEASE %precedence DOT %precedence SUB_OR_NEG %precedence NOT %left MUL %left DIV %left REM %left ADD //need subtraction only here %left LESS_THAN %left EQUAL_TO %left AND %left OR %left ASSIGN %token ID 101 %token T_INTEGER 201 %token T_ADDRESS 202 %token T_BOOLEAN 203 %token T_CHARACTER 204 %token T_STRING 205 %token C_INTEGER 301 %token C_NULL 302 %token C_CHARACTER 303 %token C_STRING 304 %token C_TRUE 305 %token C_FALSE 306 %token WHILE 401 %token IF 402 %token THEN 403 %token ELSE 404 %token TYPE 405 %token FUNCTION 406 %token RETURN 407 %token EXTERNAL 408 %token AS 409 %token L_PAREN 501 %token R_PAREN 502 %token L_BRACKET 503 %token R_BRACKET 504 %token L_BRACE 505 %token R_BRACE 506 %token SEMI_COLON 507 %token COLON 508 %token COMMA 509 %token ARROW 510 /* %token ADD 601 %token SUB_OR_NEG 602 %token MUL 603 %token DIV 604 %token REM 605 %token LESS_THAN 606 %token EQUAL_TO 607 %token ASSIGN 608 %token NOT 609 %token AND 610 %token OR 611 %token DOT 612 %token RESERVE 613 %token RELEASE 614 */ %token COMMENT 700 %% program: prototype_or_definition_list; prototype_or_definition_list: prototype prototype_or_definition_list | definition prototype_or_definition_list | prototype | definition ; prototype: L_PAREN EXTERNAL R_PAREN FUNCTION ID COLON ID; definition: TYPE ID COLON dblock | TYPE ID COLON constant ARROW ID | TYPE ID COLON types ARROW ID | FUNCTION ID COLON ID | TYPE ID COLON ID ARROW ID | ID parameter ASSIGN sblock ; parameter: L_PAREN ID R_PAREN | AS L_PAREN idlist R_PAREN ; idlist: ID COMMA idlist |ID ; sblock: L_BRACE {st = CreateScope(st,2,2);} statement_list {st = getParent(st);} R_BRACE | L_BRACE {st = CreateScope(st,2,2);} dblock statement_list {st = getParent(st);} R_BRACE ; dblock: L_BRACKET declaration_list R_BRACKET; declaration_list: declaration {printf( "declaration list a rule encountered"); //CreateEntry(st,cur_type,cur_value); } SEMI_COLON declaration_list | declaration {printf( "declaration rule b encountered"); //CreateEntry(st,cur_type,cur_value); } ; declaration: ID COLON ID { CreateEntry(st,strdup($1),strdup($3)); // printf("declaration rule encountered"); // if(cur_value != NULL){ // char* delete1 = cur_value; // printf("delete1 var assigned to cur_value"); // free(delete1); // printf("delete1 var freed"); // } // if(cur_type != NULL){ // char* delete2 = cur_type; // free(delete2);} // int len = strlen($1); // printf("length determined"); // cur_value = malloc(len + 1); // printf("space allocated"); // strcpy(cur_value, $1); // printf("string copied over"); // len = strlen($3); // cur_type = malloc(len + 1); // strcpy(cur_type, $3); // printf("value var is %s type var is %s\n",cur_value,cur_type); } | types COLON ID ; statement_list: compound_statement statement_list | compound_statement | simple_statement SEMI_COLON statement_list | simple_statement SEMI_COLON ; compound_statement: WHILE L_PAREN expression R_PAREN sblock | IF L_PAREN expression R_PAREN THEN sblock ELSE sblock | sblock ; simple_statement: assignable ASSIGN expression | RETURN expression ; assignable: ID | assignable ablock | assignable DOT ID ; expression: constant | UnaryOperator expression | assignable | constant binaryOperator expression | L_PAREN expression R_PAREN | memOp assignable ; ablock: L_PAREN argument_list R_PAREN; argument_list: expression COMMA argument_list | expression ; UnaryOperator: SUB_OR_NEG | NOT ; memOp: RESERVE | RELEASE ; binaryOperator: ADD | SUB_OR_NEG | MUL | DIV | REM | AND | OR | LESS_THAN | EQUAL_TO ; constant: C_STRING | C_INTEGER | C_NULL | C_CHARACTER | C_TRUE | C_FALSE ; types: T_STRING | T_INTEGER | T_ADDRESS | T_CHARACTER | T_BOOLEAN ; // %% void yyerror(const char *err) { // fprintf(stderr, "ERROR: %s at token %s at line number %d,column number %d\n", err,yytext,line_number,column_number); } int main() { //char *str = strdup("taco"); //cur_value = NULL; //cur_type = NULL; token_tracker = 1; st=CreateScope(NULL,1,1); //int a; yyparse(); //while ((a = yyparse() != EOF){ // token_tracker++; //printf("%d = a: yytext = %s: yychar = %d, token number: %d\n", a, yytext, yychar,token_tracker); //if(yytext[0] == '\n'){ FILE* f = fdopen(1,"w"); print_symbol_table(getAncestor(st),f); fclose(f); // break; //} //} return 0; }