From 4e84613981e9b8fe68ece2e957db20cd9426870f Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 20 May 2025 21:26:40 +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=82=D0=B8=D0=BF=20=D0=BC=D0=B0=D0=BF=D1=8B,=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B0=D0=BB=20=D0=BC=D0=B0=D0=BF=D1=8B,=20?= =?UTF-8?q?=D0=B2=D0=B7=D1=8F=D1=82=D0=B8=D0=B5=20=D0=B8=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D1=83=20=D1=8D=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D0=BC=D0=B0=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/test/test.l | 1 + analyzers/test/test.y | 25 ++++++++++++++++++++++++- tests/test_maps.txt | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 tests/test_maps.txt diff --git a/analyzers/test/test.l b/analyzers/test/test.l index b85db85..24dd318 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -72,6 +72,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] "++" { return INC; } "--" { return DEC; } +"map" { return MAP; } "struct" { return STRUCT; } "type" { return TYPE; } "go" { return GO; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 487cef0..13928fc 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -25,7 +25,7 @@ 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 +%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP %token CHAN CONST CASE SWITCH %token PLUS MINUS MULT DIV MOD %token STRING @@ -89,6 +89,7 @@ any_identifier: IDENTIFIER | WITH_DOT_IDENTIFIER | arr_element + | map_element // // lists @@ -301,6 +302,7 @@ func_types: type: int_types { } + | map_types | slice_types | arr_types { } | struct_types { } @@ -317,6 +319,7 @@ type: // literals literal: STRING_LITERAL { } + | map_literal | slice_literal | arr_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 declarate_field_list: | arg_declaration diff --git a/tests/test_maps.txt b/tests/test_maps.txt new file mode 100644 index 0000000..4534131 --- /dev/null +++ b/tests/test_maps.txt @@ -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 + + +} \ No newline at end of file