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