From 00e45f0c6a7d1dedd20fdc72c0b23fb5fd02f183 Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 13 May 2025 17:15:30 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=88=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=8B=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/test/test.l | 4 -- analyzers/test/test.y | 114 +++++++++++++++--------------------------- 2 files changed, 39 insertions(+), 79 deletions(-) diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 02bd3dd..20be97b 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -50,22 +50,18 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] ";" { return SEMICOLON; } \"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол - // yylval.str = strdup(yytext); return STRING_LITERAL; } {LETTER}{LETTER_OR_DIGIT}* { - yylval.str = strdup(yytext); return IDENTIFIER; } [0-9]+\.[0-9]+ { - yylval.str = strdup(yytext); return FLOAT_LITERAL; } {DIGIT}+ { - yylval.num = atoi(yytext); return NUMBER; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index 4f0939e..eac2e85 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -22,19 +22,12 @@ void free_node(char *str) { } %token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA -%token VAR FUNC RETURN +%token VAR FUNC RETURN IDENTIFIER STRING_LITERAL FLOAT_LITERAL NUMBER %token PLUS MINUS MULT DIV MOD EXP %token STRING %token UINT UINT8 UINT16 UINT32 UINT64 %token INT INT8 INT16 INT32 INT64 - -%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 @@ -62,60 +55,56 @@ statements_list: ; expr: - 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; } + RETURN math_expr { } + | IDENTIFIER ASSIGN math_expr { } + | math_expr { } ; 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); } + math_expr PLUS math_expr { } + | math_expr MINUS math_expr { } + | math_expr MULT math_expr { } + | math_expr DIV math_expr { } + | math_expr MOD math_expr { } + | math_expr EXP math_expr { } + | MINUS math_expr %prec UMINUS { } + | LPAREN math_expr RPAREN { } + | NUMBER { } + | FLOAT_LITERAL { } + | IDENTIFIER { } ; /* Остальные правила остаются без изменений */ int_types: - 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"); } + UINT { } + | UINT8 { } + | UINT16 { } + | UINT32 { } + | UINT64 { } + | INT { } + | INT8 { } + | INT16 { } + | INT32 {} + | INT64 { } ; string_types: - STRING { $$ = strdup("string"); } + STRING { } ; type: - int_types { $$ = $1; } - | string_types { $$ = $1; } + int_types { } + | string_types { } ; literal: - STRING_LITERAL { $$ = 0; /* Для строк возвращаем 0 */ free_node($1); } - | FLOAT_LITERAL { $$ = atof($1); free_node($1); } - | NUMBER { $$ = $1; } + STRING_LITERAL { } + | FLOAT_LITERAL { } + | NUMBER { } ; arg_declaration: - IDENTIFIER type { - $$ = $2; - printf("Argument: %s %s\n", $1, $2); - free_node($1); - } + IDENTIFIER type { } ; arg_list: @@ -124,44 +113,19 @@ arg_list: ; return_type: - /* empty */ { $$ = NULL; } - | type { $$ = $1; } + | type { } ; 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); - } + FUNC IDENTIFIER LPAREN arg_list RPAREN return_type block { } ; var_declaration: - 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); - } - | VAR IDENTIFIER type { - printf("Variable declaration: var %s %s\n", $2, $3); - 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); - free_node($3); - free_node($5); - } + IDENTIFIER SHORT_DECLARATION math_expr { } + | IDENTIFIER SHORT_DECLARATION literal { } + | VAR IDENTIFIER type { } + | VAR IDENTIFIER type ASSIGN math_expr { } + | VAR IDENTIFIER type ASSIGN literal { } ; %%