diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 24dd318..d6a0154 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -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; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 13928fc..cdfbd82 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -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 + %% // diff --git a/tests/test_chans.txt b/tests/test_chans.txt new file mode 100644 index 0000000..2a1c60f --- /dev/null +++ b/tests/test_chans.txt @@ -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); +} \ No newline at end of file