From 62f411eb2c00580ac5025b5eef40e561d4d3e1de Mon Sep 17 00:00:00 2001 From: serr Date: Sun, 18 May 2025 18:20:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=20return,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=20=D0=B1=D1=8B=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D1=82=D1=8B=D0=BC=20=D0=B8=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=20=D0=BF=D1=80=D0=B8=D1=81=D0=B2=D0=BE=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/test/test.l | 1 + analyzers/test/test.y | 11 +++++++---- tests/main.go | 12 ++++++++---- tests/test_cicle.txt | 2 ++ tests/test_func_calls.txt | 5 +++++ tests/test_if.txt | 2 +- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/analyzers/test/test.l b/analyzers/test/test.l index c98fc8e..065f018 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -70,6 +70,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] "++" { return INC; } "--" { return DEC; } +"range" { return RANGE; } "for" { return FOR; } "break" { return BREAK; } "switch" { return SWITCH; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 7363a63..e420d6e 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -25,7 +25,7 @@ void free_node(char *str) { %token VAR FUNC RETURN STRING_LITERAL FLOAT_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 +%token FOR BREAK CONTINUE ARROW IF ELSE RANGE %token CHAN CONST CASE SWITCH %token PLUS MINUS MULT DIV MOD %token STRING @@ -78,7 +78,6 @@ block: LBRACE statements_list RBRACE ; - any_identifier: IDENTIFIER | WITH_DOT_IDENTIFIER @@ -111,7 +110,8 @@ math_expr_or_literals_list_or_empty: // condition condition: - IF log_expr block else_part + IF var_multiple_short_declaration SEMICOLON log_expr block else_part + | IF log_expr block else_part else_part: { printf("\033[1;33mSTATEMENT: if condition with block\033[0m\n"); } @@ -128,6 +128,8 @@ cicle: { printf("\033[1;34mLOOP: full for loop with init, condition and post\033[0m\n"); } | FOR log_expr loop_block { printf("\033[1;34mLOOP: for loop with condition only\033[0m\n"); } + | FOR identifiers_list SHORT_DECLARATION RANGE IDENTIFIER loop_block + { printf("\033[1;34mLOOP: range for loop\033[0m\n"); } ; post_statement: @@ -187,7 +189,7 @@ continue_statement: // expressions expr: - RETURN math_expr { printf("\033[1;35mRETURN math expr\033[0m\n") } + RETURN math_expr_or_literals_list_or_empty { printf("\033[1;35mRETURN math expr\033[0m\n") } | RETURN literal { printf("\033[1;35mRETURN literal\033[0m\n") } | IDENTIFIER ASSIGN math_expr { } | math_expr { } @@ -221,6 +223,7 @@ log_expr: | math_expr GEQ math_expr { } | LPAREN log_expr RPAREN { } | BOOL_LITERAL + | func_call ; // diff --git a/tests/main.go b/tests/main.go index 42e9ed7..58bff87 100644 --- a/tests/main.go +++ b/tests/main.go @@ -1,9 +1,13 @@ package main -func test(a int) int { - return a -} +import "fmt" func main() { - panic(test(test(1)*2 + 1)) + + arr := []int{1, 2, 3} + for idx, val := range arr { + fmt.Println(idx, val) + } + + return } diff --git a/tests/test_cicle.txt b/tests/test_cicle.txt index 87bd634..d6a91ba 100644 --- a/tests/test_cicle.txt +++ b/tests/test_cicle.txt @@ -66,4 +66,6 @@ outer2: for key, value := range m { } + return; + } \ No newline at end of file diff --git a/tests/test_func_calls.txt b/tests/test_func_calls.txt index 68f8dbc..ef51096 100644 --- a/tests/test_func_calls.txt +++ b/tests/test_func_calls.txt @@ -11,4 +11,9 @@ func test(a int) int { func main() { a := test(1); // вызов функции обычной fmt.Println(test(test(1)*2+3 - a)); // вызов функции из fmt + + return; + + return 1,2,3,a,"123",1.232, test(1)*2; + } diff --git a/tests/test_if.txt b/tests/test_if.txt index 2440dce..ecfbb6b 100644 --- a/tests/test_if.txt +++ b/tests/test_if.txt @@ -45,7 +45,7 @@ func main() { } func isValid() bool { - return true + return true; } func shouldReturn() bool {