добавил указатели

master2
serr 2025-05-21 00:15:46 +03:00
parent b6765464e1
commit 8b00453427
3 changed files with 21 additions and 2 deletions

View File

@ -110,6 +110,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
";" { return SEMICOLON; } ";" { return SEMICOLON; }
"..." { return DOTS; } "..." { return DOTS; }
":" { return COLON; } ":" { return COLON; }
"&" { return AMPERSAND; }
"//" { "//" {
int c; int c;

View File

@ -25,9 +25,9 @@ void free_node(char *str) {
%token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT %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 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 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 CHAN CONST CASE SWITCH MAKE
%token PLUS MINUS MULT DIV MOD %token PLUS MINUS MULT DIV MOD AMPERSAND
%token STRING %token STRING
%token UINT UINT8 UINT16 UINT32 UINT64 UINT_PTR %token UINT UINT8 UINT16 UINT32 UINT64 UINT_PTR
%token INT INT8 INT16 INT32 INT64 %token INT INT8 INT16 INT32 INT64
@ -48,6 +48,7 @@ void free_node(char *str) {
%right NOT %right NOT
%nonassoc EQ NEQ LT GT LEQ GEQ %nonassoc EQ NEQ LT GT LEQ GEQ
%left UMINUS %left UMINUS
%right POINTER_TYPE
%% %%
@ -93,6 +94,7 @@ block:
any_identifier: any_identifier:
IDENTIFIER IDENTIFIER
| WITH_DOT_IDENTIFIER | WITH_DOT_IDENTIFIER
| MULT any_identifier %prec POINTER_TYPE { printf("DEREFERENCED IDENTIFIER\n"); }
| arr_element | arr_element
| map_element | map_element
// //
@ -241,6 +243,8 @@ math_expr:
| math_expr MULT math_expr { printf("MULT\n"); } | math_expr MULT math_expr { printf("MULT\n"); }
| math_expr DIV math_expr { printf("DIV\n"); } | math_expr DIV math_expr { printf("DIV\n"); }
| math_expr MOD math_expr { printf("MOD\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"); } | MINUS math_expr %prec UMINUS { printf("UMINUS\n"); }
| LPAREN { printf("LPAREN\n"); } math_expr RPAREN { printf("RPAREN\n"); } | LPAREN { printf("LPAREN\n"); } math_expr RPAREN { printf("RPAREN\n"); }
| NUMBER { printf("NUMBER\n"); } | NUMBER { printf("NUMBER\n"); }
@ -315,6 +319,7 @@ type:
int_types { } int_types { }
| IDENTIFIER | IDENTIFIER
| MULT type %prec POINTER_TYPE { printf("POINTER TYPE\n"); }
| chan_types | chan_types
| map_types | map_types
| slice_types | slice_types

13
tests/test_ptr.txt Normal file
View File

@ -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);
}
}