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