добавил тип мапы, литерал мапы, взятие и установку элемента мапы

master2
serr 2025-05-20 21:26:40 +03:00
parent 03c4cc6c77
commit 4e84613981
3 changed files with 68 additions and 1 deletions

View File

@ -72,6 +72,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
"++" { return INC; } "++" { return INC; }
"--" { return DEC; } "--" { return DEC; }
"map" { return MAP; }
"struct" { return STRUCT; } "struct" { return STRUCT; }
"type" { return TYPE; } "type" { return TYPE; }
"go" { return GO; } "go" { return GO; }

View File

@ -25,7 +25,7 @@ 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 %token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP
%token CHAN CONST CASE SWITCH %token CHAN CONST CASE SWITCH
%token PLUS MINUS MULT DIV MOD %token PLUS MINUS MULT DIV MOD
%token STRING %token STRING
@ -89,6 +89,7 @@ any_identifier:
IDENTIFIER IDENTIFIER
| WITH_DOT_IDENTIFIER | WITH_DOT_IDENTIFIER
| arr_element | arr_element
| map_element
// //
// lists // lists
@ -301,6 +302,7 @@ func_types:
type: type:
int_types { } int_types { }
| map_types
| slice_types | slice_types
| arr_types { } | arr_types { }
| struct_types { } | struct_types { }
@ -317,6 +319,7 @@ type:
// literals // literals
literal: literal:
STRING_LITERAL { } STRING_LITERAL { }
| map_literal
| slice_literal | slice_literal
| arr_literal { } | arr_literal { }
| struct_literal { } | struct_literal { }
@ -416,6 +419,26 @@ func_declaration:
; ;
// //
// map
map_field:
literal COLON literal { }
| literal COLON math_expr { }
| literal COLON func_call { }
map_field_list:
| map_field
| map_field_list COMMA map_field
map_types:
MAP LBRACK type RBRACK type
map_literal:
map_types LBRACE map_field_list RBRACE
map_element:
IDENTIFIER LBRACK literal RBRACK
| IDENTIFIER LBRACK any_identifier RBRACK
// struct // struct
declarate_field_list: declarate_field_list:
| arg_declaration | arg_declaration

43
tests/test_maps.txt Normal file
View File

@ -0,0 +1,43 @@
package main;
func test() int {
return 123;
}
func main() {
var m1 map[string]int; // nil-мапа
// Литерал
m3 := map[string]int{
"Alice": 25,
"Bob": 30,
"1": test()
};
m_hard := map[string]map[float32]func() int {
"group1": map[float32]func() int {
3.14: func() int { return 42; },
2.71: func() int { return 100; }
},
"group2": map[float32]func() int{
1.41: func() int {
fmt.Println("Вызвана функция из group2!");
return 200;
},
0.01: func() int { return 1; }
}
};
m3 := map[string]int{ // Литерал
"Alice": 25,
"Bob": 30
};
// Добавление элемента
m3["Charlie"] = 28;
// Проверка наличия ключа
age, ok := m3["Alice"]; // ok = true, age = 25
}