diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 417cb3d..c41accb 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -61,6 +61,8 @@ program: statement: | var_declaration SEMICOLON { printf("\033[1;33mSTATEMENT: variable declaration\033[0m\n"); } + | var_multiple_declaration SEMICOLON + { printf("\033[1;33mSTATEMENT: variable multiple declaration\033[0m\n"); } | func_declaration { printf("\033[1;33mSTATEMENT: function declaration\033[0m\n"); } | cicle @@ -71,15 +73,28 @@ statement: { printf("\033[1;33mSTATEMENT: label definition '%s'\033[0m\n", $1); } ; +block: + LBRACE statements_list RBRACE + ; +// + +// lists statements_list: | statements_list statement | statements_list block | statements_list expr SEMICOLON ; -block: - LBRACE statements_list RBRACE - ; +identifiers_list: + IDENTIFIER { } + | identifiers_list COMMA IDENTIFIER { } + +math_expr_and_literals_list: + literal { } + | math_expr_and_literals_list COMMA literal + + | math_expr { } + | math_expr_and_literals_list COMMA math_expr // // condition @@ -104,7 +119,7 @@ cicle: ; post_statement: - | IDENTIFIER ASSIGN math_expr { } + | identifiers_list ASSIGN math_expr_and_literals_list { } | IDENTIFIER INC { } | IDENTIFIER DEC { } | IDENTIFIER PLUS_EQ math_expr { } @@ -124,8 +139,8 @@ loop_block: ; init_loop_statement: - | IDENTIFIER SHORT_DECLARATION math_expr - | IDENTIFIER ASSIGN math_expr + | identifiers_list SHORT_DECLARATION math_expr_and_literals_list + | identifiers_list ASSIGN math_expr_and_literals_list loop_statements: | loop_statements statement @@ -288,10 +303,11 @@ func_declaration: // // vars decl +var_multiple_declaration: + identifiers_list SHORT_DECLARATION math_expr_and_literals_list + var_declaration: - IDENTIFIER SHORT_DECLARATION math_expr { printf("\033[1;33mSHORT DECL with math expr: %s\n\033[0m", $1); } - | IDENTIFIER SHORT_DECLARATION literal { printf("\033[1;33mSHORT DECL with literal: %s\n\033[0m", $1); } - | VAR IDENTIFIER type { { printf("\033[1;33mVAR DECL without init value: %s\n\033[0m", $2); } } + VAR IDENTIFIER type { { printf("\033[1;33mVAR DECL without init value: %s\n\033[0m", $2); } } | VAR IDENTIFIER type ASSIGN math_expr { { printf("\033[1;33mVAR DECL with math expr init value: %s\n\033[0m", $2); } } | VAR IDENTIFIER type ASSIGN literal { { printf("\033[1;33mVAR DECL with literal init value: %s\n\033[0m", $2); } } ; diff --git a/tests/main.go b/tests/main.go index b86689e..160371e 100644 --- a/tests/main.go +++ b/tests/main.go @@ -9,7 +9,8 @@ const ( func main() { - a, b := 1, 2 + for k, l := 0, 10; k < l; k, l = k+1, l-1 { + } fmt.Println(a, b) diff --git a/tests/test_multiple_declaration.txt b/tests/test_multiple_declaration.txt index 8cd22ef..647ee9c 100644 --- a/tests/test_multiple_declaration.txt +++ b/tests/test_multiple_declaration.txt @@ -1,6 +1,15 @@ package main; func test() { - a := 1; // декларация одной переменной + a := 1; // декларация одной переменной (число) + a := "test"; // декларация одной переменной (строка) + + a, b := 1, 2; // декларация нескольких переменных (целые литералы) + a, b := "hello", "sailor"; // декларация нескольких переменных (строковые литералы) + a, b, c, d := "hello", 2, 3.123, true; // декларация нескольких переменных (всякое) + + for k, l := 0, 10; k < l; k, l = k+1, l-1 { + + } } \ No newline at end of file