добавил каналы и оператор make

master2
serr 2025-05-20 22:17:57 +03:00
parent 4e84613981
commit 6296d653da
3 changed files with 43 additions and 5 deletions

View File

@ -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; }

View File

@ -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
%%
//

23
tests/test_chans.txt Normal file
View File

@ -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);
}