From 6dcad0752073e30f75bfaa787b66b1b71b49d52f Mon Sep 17 00:00:00 2001 From: Partho Bhattacharya Date: Fri, 7 Mar 2025 13:36:07 -0500 Subject: [PATCH] fixed precedence tests --- src/grammar.y | 67 ++++++++++--------- src/lexicalStructure.lex | 2 +- .../sprint2/test/sp2_integer_binary_op.alpha | 15 +++++ 3 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 tests/sprint2/test/sp2_integer_binary_op.alpha diff --git a/src/grammar.y b/src/grammar.y index 3732fc1..f4a8b1b 100644 --- a/src/grammar.y +++ b/src/grammar.y @@ -1,6 +1,7 @@ %{ #include #include "../src/symbol_table.c" + #include extern int yylex(void); void yyerror(const char *err); extern char* yytext; @@ -21,16 +22,18 @@ char * words; } -//need subtraction only here + %type id_or_types %type types +%type expression +%type constant %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_INTEGER 301 %token C_NULL 302 %token C_CHARACTER 303 %token C_STRING 304 @@ -72,17 +75,19 @@ %token COMMENT 700 //precedence order -%precedence RESERVE RELEASE -%precedence DOT -%precedence UMINUS -%precedence NOT -%left MUL DIV REM -%left ADD SUB_OR_NEG -%left LESS_THAN -%left EQUAL_TO -%left AND -%left OR %left ASSIGN +%left OR +%left AND +%left EQUAL_TO +%left LESS_THAN +%left ADD SUB_OR_NEG +%left MUL DIV REM +%precedence NOT +%precedence UMINUS +%precedence DOT +%precedence RESERVE RELEASE + + %% @@ -125,7 +130,7 @@ idlist: sblock: L_BRACE {cur = CreateScope(cur,@1.first_line,@1.first_column);} statement_list {cur = getParent(cur);} R_BRACE - | L_BRACE {cur = CreateScope(cur,@1.first_line,@1.first_column);} dblock statement_list {cur = getParent(cur);} R_BRACE + | L_BRACE {cur = CreateScope(cur,@1.first_line,@1.first_column);} dblock {printf("seen sblock with dblock\n");} statement_list {cur = getParent(cur);} R_BRACE ; dblock: @@ -155,7 +160,7 @@ statement_list: compound_statement: WHILE L_PAREN expression R_PAREN sblock | IF L_PAREN expression R_PAREN THEN sblock ELSE sblock - | sblock + | sblock //{printf("seen a compound statement rule\n");} ; simple_statement: @@ -173,21 +178,21 @@ rec_op : DOT expression: - constant - | SUB_OR_NEG expression %prec UMINUS - | NOT expression - | expression ADD expression - | expression SUB_OR_NEG expression - | expression MUL expression - | expression DIV expression - | expression REM expression - | expression AND expression - | expression OR expression - | expression LESS_THAN expression - | expression EQUAL_TO expression - | assignable - | L_PAREN expression R_PAREN - | memOp assignable + constant {printf("constant expression\n");} + | SUB_OR_NEG expression %prec UMINUS {printf("negative expression\n");} + | NOT expression {printf("not expression\n");} + | expression ADD expression {printf("add expression\n");} + | expression SUB_OR_NEG expression {printf("subtract expression\n");} + | expression MUL expression {printf("multiply expression\n");} + | expression DIV expression {printf("division expression\n");} + | expression REM expression {printf("remainder expression\n");} + | expression AND expression {printf("and expression\n");} + | expression OR expression {printf("or expression\n");} + | expression LESS_THAN expression {printf("less than expression\n");} + | expression EQUAL_TO expression {printf("equals check expression\n");} + | assignable {printf("assignable expression\n");} + | L_PAREN expression R_PAREN {printf("paren expression\n");} + | memOp assignable ; ablock: @@ -201,8 +206,8 @@ argument_list: memOp: - RESERVE - | RELEASE + RESERVE {printf("reserve expression\n");} + | RELEASE {printf("release expression\n");} ; diff --git a/src/lexicalStructure.lex b/src/lexicalStructure.lex index aae5433..0c53b6f 100644 --- a/src/lexicalStructure.lex +++ b/src/lexicalStructure.lex @@ -72,7 +72,7 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\] "," {if(DEBUG) {printf( "COMMA: %s (%d)\n", yytext, COMMA);} else {if(tok_flag != NULL){print_tok(COMMA);}incr(line_number,column_number,COMMA);return COMMA;}} "->" {if(DEBUG) {printf( "ARROW: %s (%d)\n", yytext, ARROW);} else {if(tok_flag != NULL){print_tok(ARROW);}incr(line_number,column_number,ARROW);return ARROW;}} -{DIGIT}+ {if(DEBUG) {printf( "C_INTEGER: %s (%d)\n", yytext, C_INTEGER);} else {if(tok_flag != NULL){print_tok(C_INTEGER);}incr(line_number,column_number,C_INTEGER);return C_INTEGER;}} +{DIGIT}+ {if(DEBUG) {printf( "C_INTEGER: %s (%d)\n", yytext, C_INTEGER);} else {if(tok_flag != NULL){print_tok(C_INTEGER);}incr(line_number,column_number,C_INTEGER);yylval.integ = atoi(yytext);return C_INTEGER;}} '{CHAR}' {if(DEBUG) {printf( "C_CHARACTER: %s (%d)\n", yytext, C_CHARACTER);} else {if(tok_flag != NULL){print_tok(C_CHARACTER);}incr(line_number,column_number,C_CHARACTER);return C_CHARACTER;}} \"{SCHAR}*\" {if(DEBUG) {printf( "C_STRING: %s (%d)\n", yytext, C_STRING);} else {if(tok_flag != NULL){print_tok(C_STRING);}incr(line_number,column_number,C_STRING);return C_STRING;}} {COMMENT} {if(DEBUG) {printf( "COMMENT: %s (%d)\n", yytext, COMMENT);} else {if(tok_flag != NULL){print_tok(COMMENT);}incr(line_number,column_number,COMMENT);/*return COMMENT;*/}} diff --git a/tests/sprint2/test/sp2_integer_binary_op.alpha b/tests/sprint2/test/sp2_integer_binary_op.alpha new file mode 100644 index 0000000..39e00a6 --- /dev/null +++ b/tests/sprint2/test/sp2_integer_binary_op.alpha @@ -0,0 +1,15 @@ +entry(arg) := { + [integer:x; address: arr; address: arr2; Boolean : b2; Boolean : b1] + x := 3 + 2 * 8; + x := 3 - 2 / 8; + x := 3 * 2 % 8; + x := 3 * 2 % 8; + x := 3 % 2 * 8; + x := 3 + 2 - 8; + arr2 := 1 * reserve x; + arr2 := release x; + b2 := 3 < 2; + b1 := 1 = 2; + b2 := !(3 < 2); + b1 := 6<7 & 7=7; +}