From d609dd2dca2da6a5af3adad67a568e0dc307fb81 Mon Sep 17 00:00:00 2001 From: Partho Bhattacharya Date: Thu, 27 Feb 2025 20:03:50 -0500 Subject: [PATCH] added skeleton rules and grammar to bison file --- grammar.y | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++--- parser | Bin 36648 -> 40856 bytes 2 files changed, 119 insertions(+), 6 deletions(-) diff --git a/grammar.y b/grammar.y index c267eeb..adb4aa7 100644 --- a/grammar.y +++ b/grammar.y @@ -10,7 +10,8 @@ extern char* yytext; extern int yychar; SymbolTable * st; - + char* cur_value; + char* cur_type; %} %token ID 101 @@ -61,12 +62,122 @@ %token COMMENT 700 %% -start: /*empty for now*/ - OPTIONAL; +program: + prototype_or_definition_list; -OPTIONAL: - L_BRACKET {printf("success");}; +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 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,1,1);} statement_list {st = getParent(st);} R_BRACE + | L_BRACE {st = CreateScope(st,1,1);} dblock statement_list {st = getParent(st);} R_BRACE + ; + +dblock: + L_BRACKET declaration_list R_BRACKET; + +declaration_list: + declaration {CreateEntry(st,cur_type,cur_value);} SEMI_COLON declaration_list + | declaration {CreateEntry(st,cur_type,cur_value);} + ; + +declaration: + ID COLON ID {cur_value = strdup($1);cur_type = strdup($3);}; + +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 + | expression 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 + ; // %% @@ -75,11 +186,13 @@ void yyerror(const char *err) { } int main() { + cur_value[1] = ""; + cur_type[1] = ""; st=CreateScope(NULL,1,1); int a; while ((a = yyparse()) != EOF){ printf("%d = a: yytext = %s: yychar = %d\n", a, yytext, yychar); - if(yytext[0] == '!'){ + if(yytext[0] == '?'){ print_symbol_table(getAncestor(st),stdout); break; } diff --git a/parser b/parser index 3a559de4d69ab532788655642731e6d46596d7d6..05d2da9e80dd27dbbb7f6f3bb90bc8855f15ec55 100755 GIT binary patch delta 13761 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 delta 12450 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