добавил каналы и оператор 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; } "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; }

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

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