diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 73595e5..6373832 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -110,6 +110,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] ";" { return SEMICOLON; } "..." { return DOTS; } ":" { return COLON; } +"&" { return AMPERSAND; } "//" { int c; diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 9aad94e..a4d249a 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -25,9 +25,9 @@ void free_node(char *str) { %token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT %token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ %token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ -%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP CHAN INTERFACE INTERFACE_LITERAL +%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP INTERFACE INTERFACE_LITERAL %token CHAN CONST CASE SWITCH MAKE -%token PLUS MINUS MULT DIV MOD +%token PLUS MINUS MULT DIV MOD AMPERSAND %token STRING %token UINT UINT8 UINT16 UINT32 UINT64 UINT_PTR %token INT INT8 INT16 INT32 INT64 @@ -48,6 +48,7 @@ void free_node(char *str) { %right NOT %nonassoc EQ NEQ LT GT LEQ GEQ %left UMINUS +%right POINTER_TYPE %% @@ -93,6 +94,7 @@ block: any_identifier: IDENTIFIER | WITH_DOT_IDENTIFIER + | MULT any_identifier %prec POINTER_TYPE { printf("DEREFERENCED IDENTIFIER\n"); } | arr_element | map_element // @@ -241,6 +243,8 @@ math_expr: | math_expr MULT math_expr { printf("MULT\n"); } | math_expr DIV math_expr { printf("DIV\n"); } | math_expr MOD math_expr { printf("MOD\n"); } + | MULT math_expr %prec POINTER_TYPE { printf("DEREFERENCE\n"); } + | AMPERSAND math_expr %prec UMINUS { printf("ADDRESS OF\n"); } | MINUS math_expr %prec UMINUS { printf("UMINUS\n"); } | LPAREN { printf("LPAREN\n"); } math_expr RPAREN { printf("RPAREN\n"); } | NUMBER { printf("NUMBER\n"); } @@ -315,6 +319,7 @@ type: int_types { } | IDENTIFIER + | MULT type %prec POINTER_TYPE { printf("POINTER TYPE\n"); } | chan_types | map_types | slice_types diff --git a/tests/test_ptr.txt b/tests/test_ptr.txt new file mode 100644 index 0000000..ca01a48 --- /dev/null +++ b/tests/test_ptr.txt @@ -0,0 +1,13 @@ +package main; + +func main() { + var x *int; + y := &x; + *x = 10; + z := 5 * 10; + + var pf *float64; + if pf != nil { + fmt.Println("Value:", *pf); + } +} \ No newline at end of file