добавил каналы и оператор make
parent
4e84613981
commit
6296d653da
|
@ -21,7 +21,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
%%
|
%%
|
||||||
|
|
||||||
"string" { return STRING; }
|
"string" { return STRING; }
|
||||||
|
"chan" { return CHAN; }
|
||||||
"bool" { return BOOL; }
|
"bool" { return BOOL; }
|
||||||
"uint" { return UINT; }
|
"uint" { return UINT; }
|
||||||
"uint8" { return UINT8; }
|
"uint8" { return UINT8; }
|
||||||
|
@ -43,6 +43,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
"if" { return IF; }
|
"if" { return IF; }
|
||||||
"else" { return ELSE; }
|
"else" { return ELSE; }
|
||||||
"<-" { return ARROW; }
|
"<-" { return ARROW; }
|
||||||
|
"make" { return MAKE; }
|
||||||
|
|
||||||
"true" { return BOOL_LITERAL; }
|
"true" { return BOOL_LITERAL; }
|
||||||
"false" { return BOOL_LITERAL; }
|
"false" { return BOOL_LITERAL; }
|
||||||
|
|
|
@ -25,8 +25,8 @@ 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 MAP
|
%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP CHAN
|
||||||
%token CHAN CONST CASE SWITCH
|
%token CHAN CONST CASE SWITCH MAKE
|
||||||
%token PLUS MINUS MULT DIV MOD
|
%token PLUS MINUS MULT DIV MOD
|
||||||
%token STRING
|
%token STRING
|
||||||
%token UINT UINT8 UINT16 UINT32 UINT64 UINT_PTR
|
%token UINT UINT8 UINT16 UINT32 UINT64 UINT_PTR
|
||||||
|
@ -79,6 +79,9 @@ statement:
|
||||||
{ printf("\033[1;33mSTATEMENT: condition\033[0m\n"); }
|
{ printf("\033[1;33mSTATEMENT: condition\033[0m\n"); }
|
||||||
| IDENTIFIER COLON
|
| IDENTIFIER COLON
|
||||||
{ printf("\033[1;33mSTATEMENT: label definition '%s'\033[0m\n", $1); }
|
{ printf("\033[1;33mSTATEMENT: label definition '%s'\033[0m\n", $1); }
|
||||||
|
| make SEMICOLON
|
||||||
|
| any_identifier ARROW math_expr SEMICOLON
|
||||||
|
| any_identifier ARROW literal SEMICOLON
|
||||||
;
|
;
|
||||||
|
|
||||||
block:
|
block:
|
||||||
|
@ -241,10 +244,12 @@ math_expr:
|
||||||
| NUMBER { printf("NUMBER\n"); }
|
| NUMBER { printf("NUMBER\n"); }
|
||||||
| FLOAT_LITERAL { printf("FLOAT LITERAL\n"); }
|
| FLOAT_LITERAL { printf("FLOAT LITERAL\n"); }
|
||||||
| COMPLEX_LITERAL { printf("COMPLEX LITERAL\n"); }
|
| COMPLEX_LITERAL { printf("COMPLEX LITERAL\n"); }
|
||||||
|
| make { printf("make\n"); }
|
||||||
| any_identifier { printf("IDENTIFIER\n"); }
|
| any_identifier { printf("IDENTIFIER\n"); }
|
||||||
| any_identifier INC { printf("POST-INCREMENT: ++\n"); }
|
| any_identifier INC { printf("POST-INCREMENT: ++\n"); }
|
||||||
| any_identifier DEC { printf("POST-DECREMENT: --\n"); }
|
| any_identifier DEC { printf("POST-DECREMENT: --\n"); }
|
||||||
| func_call { printf("FUNCTION CALL IN EXPR\n"); }
|
| func_call { printf("FUNCTION CALL IN EXPR\n"); }
|
||||||
|
| ARROW any_identifier { printf("TAKE FROM CHAN\n"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
log_expr:
|
log_expr:
|
||||||
|
@ -302,6 +307,7 @@ func_types:
|
||||||
|
|
||||||
type:
|
type:
|
||||||
int_types { }
|
int_types { }
|
||||||
|
| chan_types
|
||||||
| map_types
|
| map_types
|
||||||
| slice_types
|
| slice_types
|
||||||
| arr_types { }
|
| arr_types { }
|
||||||
|
@ -459,13 +465,15 @@ field_list:
|
||||||
struct_literal:
|
struct_literal:
|
||||||
any_identifier LBRACE field_list RBRACE { printf("STRUCT LITERAL\n"); }
|
any_identifier LBRACE field_list RBRACE { printf("STRUCT LITERAL\n"); }
|
||||||
| any_identifier LBRACE math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); }
|
| any_identifier LBRACE math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); }
|
||||||
//
|
|
||||||
|
// chan
|
||||||
|
chan_types:
|
||||||
|
CHAN type
|
||||||
|
|
||||||
// assignment
|
// assignment
|
||||||
var_multiple_short_assignment:
|
var_multiple_short_assignment:
|
||||||
identifiers_list ASSIGN math_expr_or_literals_list
|
identifiers_list ASSIGN math_expr_or_literals_list
|
||||||
|
|
||||||
|
|
||||||
// vars decl
|
// vars decl
|
||||||
var_multiple_short_declaration:
|
var_multiple_short_declaration:
|
||||||
identifiers_list SHORT_DECLARATION math_expr_or_literals_list
|
identifiers_list SHORT_DECLARATION math_expr_or_literals_list
|
||||||
|
@ -488,6 +496,12 @@ var_declaration:
|
||||||
type_delcaration:
|
type_delcaration:
|
||||||
TYPE IDENTIFIER type { { printf("\033[1;33mTYPE DECL\n\033[0m"); } }
|
TYPE IDENTIFIER type { { printf("\033[1;33mTYPE DECL\n\033[0m"); } }
|
||||||
|
|
||||||
|
// make
|
||||||
|
make:
|
||||||
|
MAKE LPAREN type RPAREN
|
||||||
|
| MAKE LPAREN type COMMA math_expr RPAREN
|
||||||
|
| MAKE LPAREN type COMMA math_expr COMMA math_expr RPAREN
|
||||||
|
|
||||||
%%
|
%%
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package main;
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var ch chan int;
|
||||||
|
|
||||||
|
// 2. Инициализация канала с помощью make
|
||||||
|
ch = make(chan int);
|
||||||
|
fmt.Printf("После make: ch = %v\n", ch);
|
||||||
|
|
||||||
|
// 3. Запуск горутины для отправки данных
|
||||||
|
go func() {
|
||||||
|
fmt.Println("Горутина: отправляю 42 в канал");
|
||||||
|
ch <- 42; // Отправка данных
|
||||||
|
}();
|
||||||
|
|
||||||
|
// 4. Основной поток получает данные
|
||||||
|
time.Sleep(100 * time.Millisecond); // Даем время горутине запуститься
|
||||||
|
value := <-ch;
|
||||||
|
fmt.Println("Получено:", value);
|
||||||
|
|
||||||
|
// 5. Закрытие канала
|
||||||
|
close(ch);
|
||||||
|
}
|
Loading…
Reference in New Issue