добавил каналы и оператор make
parent
4e84613981
commit
6296d653da
|
@ -21,7 +21,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
|||
%%
|
||||
|
||||
"string" { return STRING; }
|
||||
|
||||
"chan" { return CHAN; }
|
||||
"bool" { return BOOL; }
|
||||
"uint" { return UINT; }
|
||||
"uint8" { return UINT8; }
|
||||
|
@ -43,6 +43,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
|||
"if" { return IF; }
|
||||
"else" { return ELSE; }
|
||||
"<-" { return ARROW; }
|
||||
"make" { return MAKE; }
|
||||
|
||||
"true" { 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 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 MAP
|
||||
%token CHAN CONST CASE SWITCH
|
||||
%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP CHAN
|
||||
%token CHAN CONST CASE SWITCH MAKE
|
||||
%token PLUS MINUS MULT DIV MOD
|
||||
%token STRING
|
||||
%token UINT UINT8 UINT16 UINT32 UINT64 UINT_PTR
|
||||
|
@ -79,6 +79,9 @@ statement:
|
|||
{ printf("\033[1;33mSTATEMENT: condition\033[0m\n"); }
|
||||
| IDENTIFIER COLON
|
||||
{ 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:
|
||||
|
@ -241,10 +244,12 @@ math_expr:
|
|||
| NUMBER { printf("NUMBER\n"); }
|
||||
| FLOAT_LITERAL { printf("FLOAT LITERAL\n"); }
|
||||
| COMPLEX_LITERAL { printf("COMPLEX LITERAL\n"); }
|
||||
| make { printf("make\n"); }
|
||||
| any_identifier { printf("IDENTIFIER\n"); }
|
||||
| any_identifier INC { printf("POST-INCREMENT: ++\n"); }
|
||||
| any_identifier DEC { printf("POST-DECREMENT: --\n"); }
|
||||
| func_call { printf("FUNCTION CALL IN EXPR\n"); }
|
||||
| ARROW any_identifier { printf("TAKE FROM CHAN\n"); }
|
||||
;
|
||||
|
||||
log_expr:
|
||||
|
@ -302,6 +307,7 @@ func_types:
|
|||
|
||||
type:
|
||||
int_types { }
|
||||
| chan_types
|
||||
| map_types
|
||||
| slice_types
|
||||
| arr_types { }
|
||||
|
@ -459,13 +465,15 @@ field_list:
|
|||
struct_literal:
|
||||
any_identifier LBRACE field_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
|
||||
var_multiple_short_assignment:
|
||||
identifiers_list ASSIGN math_expr_or_literals_list
|
||||
|
||||
|
||||
// vars decl
|
||||
var_multiple_short_declaration:
|
||||
identifiers_list SHORT_DECLARATION math_expr_or_literals_list
|
||||
|
@ -488,6 +496,12 @@ var_declaration:
|
|||
type_delcaration:
|
||||
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