From f36476bf34e612ffccb89db0a6f43fe870cae9fe Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 13 May 2025 16:50:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BC=D0=B0=D1=82=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/test/test.l | 5 +++ analyzers/test/test.y | 97 ++++++++++++++++++++++++++++--------------- tests/main.go | 5 +++ tests/test_blocks.txt | 17 ++++++++ 4 files changed, 91 insertions(+), 33 deletions(-) diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 1856a04..c55622b 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -33,10 +33,15 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] "int64" { return INT64; } "var" { return VAR; } +"func" { return FUNC; } +"return" { return RETURN; } ":=" { return SHORT_DECLARATION; } "=" { return ASSIGN; } "{" { return LBRACE; } "}" { return RBRACE; } +"(" { return LPAREN; } +")" { return RPAREN; } +"," { return COMMA; } ";" { return SEMICOLON; } \"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол diff --git a/analyzers/test/test.y b/analyzers/test/test.y index cfeccda..7fe140b 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -20,15 +20,15 @@ void free_node(char *str) { } %token IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL -%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN -%token VAR +%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA +%token VAR FUNC RETURN %token STRING %token UINT UINT8 UINT16 UINT32 UINT64 %token INT INT8 INT16 INT32 INT64 - -%type expr declaration literal +%type var_declaration literal type int_types string_types +%type arg_declaration return_type %% @@ -38,7 +38,8 @@ program: statement: expr SEMICOLON - | declaration SEMICOLON + | var_declaration SEMICOLON + | func_declaration | block ; @@ -51,61 +52,91 @@ statements_list: ; expr: - // IDENTIFIER SHORT_DECLARATION NUMBER { - // printf("Short declaration: %s := %s\n", $1, $3); - // free_node($1); - // free_node($3); - // } + // return + RETURN literal + | RETURN IDENTIFIER + // + | IDENTIFIER ASSIGN literal + | IDENTIFIER ASSIGN IDENTIFIER ; -// Типы -// Группирует все возможные типы int_types: - UINT - | UINT8 - | UINT16 - | UINT32 - | UINT64 - | INT - | INT8 - | INT16 - | INT32 - | INT64 + UINT { $$ = strdup("uint"); } + | UINT8 { $$ = strdup("uint8"); } + | UINT16 { $$ = strdup("uint16"); } + | UINT32 { $$ = strdup("uint32"); } + | UINT64 { $$ = strdup("uint64"); } + | INT { $$ = strdup("int"); } + | INT8 { $$ = strdup("int8"); } + | INT16 { $$ = strdup("int16"); } + | INT32 { $$ = strdup("int32"); } + | INT64 { $$ = strdup("int64"); } ; string_types: - STRING + STRING { $$ = strdup("string"); } ; type: - int_types - | string_types + int_types { $$ = $1; } + | string_types { $$ = $1; } ; -// -// Литералы literal: - STRING_LITERAL - | FLOAT_LITERAL - | NUMBER + STRING_LITERAL { $$ = $1; } + | FLOAT_LITERAL { $$ = $1; } + | NUMBER { $$ = $1; } + ; + +// Объявление функций +arg_declaration: + IDENTIFIER type { + $$ = $2; // Возвращаем только тип + printf("Argument: %s %s\n", $1, $2); + free_node($1); + } + ; + +arg_list: + | arg_declaration + | arg_list COMMA arg_declaration + ; + +// тип +return_type: + /* empty */ { $$ = NULL; } + | type { $$ = $1; } + ; + +func_declaration: + FUNC IDENTIFIER LPAREN arg_list RPAREN return_type block { + printf("Function declaration: %s with return type %s\n", $2, $6 ? $6 : "void"); + free_node($2); + if ($6) free_node($6); + } ; // -declaration: +// Объявление переменных +var_declaration: IDENTIFIER SHORT_DECLARATION literal { printf("Short declaration: %s := %s\n", $1, $3); free_node($1); free_node($3); } | VAR IDENTIFIER type { - printf("Variable declaration: var %s type\n", $2); + printf("Variable declaration: var %s %s\n", $2, $3); free_node($2); + free_node($3); } | VAR IDENTIFIER type ASSIGN literal { - printf("Var with assign declaration: var %s type = %s\n", $2, $5); + printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5); free_node($2); + free_node($3); + free_node($5); } ; +// %% diff --git a/tests/main.go b/tests/main.go index 182fa29..8bf0a52 100644 --- a/tests/main.go +++ b/tests/main.go @@ -2,6 +2,11 @@ package main import "fmt" +func test(a string, b int) int { + +} + func main() { + test("123", 2) fmt.Println("hello, sailor!") } diff --git a/tests/test_blocks.txt b/tests/test_blocks.txt index f3b02fd..5c34fe7 100644 --- a/tests/test_blocks.txt +++ b/tests/test_blocks.txt @@ -1,8 +1,25 @@ + +func test_func(a string, b int, c uint16) int { + var x int = 42; + y := "hello"; +} + +func func_without_args() int { + return 1; +} + +func func_without_return_type(a string) { + return a; +} + a := 1; { a := 229.162613; + a = 1; + a = s; + s := "test string"; var a int;