From 8b004534270c5644a09823c6c8d92fcc392c87d8 Mon Sep 17 00:00:00 2001 From: serr Date: Wed, 21 May 2025 00:15:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/test/test.l | 1 + analyzers/test/test.y | 9 +++++++-- tests/test_ptr.txt | 13 +++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/test_ptr.txt 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