добавил тип мапы, литерал мапы, взятие и установку элемента мапы
parent
03c4cc6c77
commit
4e84613981
|
@ -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; }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue