From f5f9256e8ffa468c4394fbe69b54321368d5cc8e Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 13 May 2025 17:10:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=20=D1=83=D0=B1=D0=B8=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D1=81=D1=82=D1=80=D0=B4=D0=B0=D0=BF=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/test/test.l | 9 +++++-- analyzers/test/test.y | 62 ++++++++++++++++++++++++++++++------------- tests/test_blocks.txt | 4 +-- tests/test_math.txt | 14 ++++++++++ 4 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 tests/test_math.txt diff --git a/analyzers/test/test.l b/analyzers/test/test.l index c55622b..02bd3dd 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -37,6 +37,11 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] "return" { return RETURN; } ":=" { return SHORT_DECLARATION; } "=" { return ASSIGN; } +"+" { return PLUS; } +"-" { return MINUS; } +"*" { return MULT; } +"/" { return DIV; } +"%" { return MOD; } "{" { return LBRACE; } "}" { return RBRACE; } "(" { return LPAREN; } @@ -45,7 +50,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] ";" { return SEMICOLON; } \"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол - yylval.str = strdup(yytext); + // yylval.str = strdup(yytext); return STRING_LITERAL; } @@ -60,7 +65,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] } {DIGIT}+ { - yylval.str = strdup(yytext); + yylval.num = atoi(yytext); return NUMBER; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 7fe140b..4f0939e 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -2,6 +2,7 @@ #include #include #include +#include extern int yylineno; extern char *yytext; @@ -17,18 +18,27 @@ void free_node(char *str) { %union { char *str; + double num; } -%token IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL %token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA %token VAR FUNC RETURN - +%token PLUS MINUS MULT DIV MOD EXP %token STRING %token UINT UINT8 UINT16 UINT32 UINT64 %token INT INT8 INT16 INT32 INT64 -%type var_declaration literal type int_types string_types + +%token IDENTIFIER STRING_LITERAL FLOAT_LITERAL +%type var_declaration type int_types string_types %type arg_declaration return_type +%type expr literal math_expr +%token NUMBER + +%left PLUS MINUS +%left MULT DIV MOD +%left EXP +%left UMINUS %% @@ -52,14 +62,26 @@ statements_list: ; expr: - // return - RETURN literal - | RETURN IDENTIFIER - // - | IDENTIFIER ASSIGN literal - | IDENTIFIER ASSIGN IDENTIFIER + RETURN math_expr { printf("Return: %g\n", $2); } + | IDENTIFIER ASSIGN math_expr { printf("Assignment: %s = %g\n", $1, $3); free_node($1); } + | math_expr { $$ = $1; } ; +math_expr: + math_expr PLUS math_expr { $$ = $1 + $3; } + | math_expr MINUS math_expr { $$ = $1 - $3; } + | math_expr MULT math_expr { $$ = $1 * $3; } + | math_expr DIV math_expr { $$ = $1 / $3; } + | math_expr MOD math_expr { $$ = fmod($1, $3); } + | math_expr EXP math_expr { $$ = pow($1, $3); } + | MINUS math_expr %prec UMINUS { $$ = -$2; } + | LPAREN math_expr RPAREN { $$ = $2; } + | NUMBER { $$ = $1; } + | FLOAT_LITERAL { $$ = atof($1); free_node($1); } + | IDENTIFIER { $$ = 0; free_node($1); } + ; + +/* Остальные правила остаются без изменений */ int_types: UINT { $$ = strdup("uint"); } | UINT8 { $$ = strdup("uint8"); } @@ -83,15 +105,14 @@ type: ; literal: - STRING_LITERAL { $$ = $1; } - | FLOAT_LITERAL { $$ = $1; } + STRING_LITERAL { $$ = 0; /* Для строк возвращаем 0 */ free_node($1); } + | FLOAT_LITERAL { $$ = atof($1); free_node($1); } | NUMBER { $$ = $1; } ; -// Объявление функций arg_declaration: IDENTIFIER type { - $$ = $2; // Возвращаем только тип + $$ = $2; printf("Argument: %s %s\n", $1, $2); free_node($1); } @@ -102,7 +123,6 @@ arg_list: | arg_list COMMA arg_declaration ; -// тип return_type: /* empty */ { $$ = NULL; } | type { $$ = $1; } @@ -115,11 +135,13 @@ func_declaration: if ($6) free_node($6); } ; -// -// Объявление переменных var_declaration: - IDENTIFIER SHORT_DECLARATION literal { + IDENTIFIER SHORT_DECLARATION math_expr { + printf("Short declaration: %s := %g\n", $1, $3); + free_node($1); + } + | IDENTIFIER SHORT_DECLARATION literal { printf("Short declaration: %s := %s\n", $1, $3); free_node($1); free_node($3); @@ -129,6 +151,11 @@ var_declaration: free_node($2); free_node($3); } + | VAR IDENTIFIER type ASSIGN math_expr { + printf("Var with assign declaration: var %s %s = %g\n", $2, $3, $5); + free_node($2); + free_node($3); + } | VAR IDENTIFIER type ASSIGN literal { printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5); free_node($2); @@ -136,7 +163,6 @@ var_declaration: free_node($5); } ; -// %% diff --git a/tests/test_blocks.txt b/tests/test_blocks.txt index 5c34fe7..f4da731 100644 --- a/tests/test_blocks.txt +++ b/tests/test_blocks.txt @@ -12,7 +12,7 @@ func func_without_return_type(a string) { return a; } -a := 1; +a := 1 + 2; { a := 229.162613; @@ -35,7 +35,7 @@ a := 1; var a string = "123123"; { - b := 2; + b := 2 - 1; s := "123"; diff --git a/tests/test_math.txt b/tests/test_math.txt new file mode 100644 index 0000000..7a5fe84 --- /dev/null +++ b/tests/test_math.txt @@ -0,0 +1,14 @@ + + +func test() { + + return a; +} + +func main() { + + var a int; + a = 2+2*2-(1+10); + a = a + 1; + a = a; +} \ No newline at end of file