убрал лишние вычисления

ilya
serr 2025-05-13 17:15:30 +03:00
parent f5f9256e8f
commit 00e45f0c6a
2 changed files with 39 additions and 79 deletions

View File

@ -50,22 +50,18 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
";" { return SEMICOLON; } ";" { return SEMICOLON; }
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол \"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол
// yylval.str = strdup(yytext);
return STRING_LITERAL; return STRING_LITERAL;
} }
{LETTER}{LETTER_OR_DIGIT}* { {LETTER}{LETTER_OR_DIGIT}* {
yylval.str = strdup(yytext);
return IDENTIFIER; return IDENTIFIER;
} }
[0-9]+\.[0-9]+ { [0-9]+\.[0-9]+ {
yylval.str = strdup(yytext);
return FLOAT_LITERAL; return FLOAT_LITERAL;
} }
{DIGIT}+ { {DIGIT}+ {
yylval.num = atoi(yytext);
return NUMBER; return NUMBER;
} }

View File

@ -22,19 +22,12 @@ void free_node(char *str) {
} }
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA %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 PLUS MINUS MULT DIV MOD EXP
%token STRING %token STRING
%token UINT UINT8 UINT16 UINT32 UINT64 %token UINT UINT8 UINT16 UINT32 UINT64
%token INT INT8 INT16 INT32 INT64 %token INT INT8 INT16 INT32 INT64
%token <str> IDENTIFIER STRING_LITERAL FLOAT_LITERAL
%type <str> var_declaration type int_types string_types
%type <str> arg_declaration return_type
%type <num> expr literal math_expr
%token <num> NUMBER
%left PLUS MINUS %left PLUS MINUS
%left MULT DIV MOD %left MULT DIV MOD
%left EXP %left EXP
@ -62,60 +55,56 @@ statements_list:
; ;
expr: expr:
RETURN math_expr { printf("Return: %g\n", $2); } RETURN math_expr { }
| IDENTIFIER ASSIGN math_expr { printf("Assignment: %s = %g\n", $1, $3); free_node($1); } | IDENTIFIER ASSIGN math_expr { }
| math_expr { $$ = $1; } | math_expr { }
; ;
math_expr: math_expr:
math_expr PLUS math_expr { $$ = $1 + $3; } math_expr PLUS math_expr { }
| math_expr MINUS math_expr { $$ = $1 - $3; } | math_expr MINUS math_expr { }
| math_expr MULT math_expr { $$ = $1 * $3; } | math_expr MULT math_expr { }
| math_expr DIV math_expr { $$ = $1 / $3; } | math_expr DIV math_expr { }
| math_expr MOD math_expr { $$ = fmod($1, $3); } | math_expr MOD math_expr { }
| math_expr EXP math_expr { $$ = pow($1, $3); } | math_expr EXP math_expr { }
| MINUS math_expr %prec UMINUS { $$ = -$2; } | MINUS math_expr %prec UMINUS { }
| LPAREN math_expr RPAREN { $$ = $2; } | LPAREN math_expr RPAREN { }
| NUMBER { $$ = $1; } | NUMBER { }
| FLOAT_LITERAL { $$ = atof($1); free_node($1); } | FLOAT_LITERAL { }
| IDENTIFIER { $$ = 0; free_node($1); } | IDENTIFIER { }
; ;
/* Остальные правила остаются без изменений */ /* Остальные правила остаются без изменений */
int_types: int_types:
UINT { $$ = strdup("uint"); } UINT { }
| UINT8 { $$ = strdup("uint8"); } | UINT8 { }
| UINT16 { $$ = strdup("uint16"); } | UINT16 { }
| UINT32 { $$ = strdup("uint32"); } | UINT32 { }
| UINT64 { $$ = strdup("uint64"); } | UINT64 { }
| INT { $$ = strdup("int"); } | INT { }
| INT8 { $$ = strdup("int8"); } | INT8 { }
| INT16 { $$ = strdup("int16"); } | INT16 { }
| INT32 { $$ = strdup("int32"); } | INT32 {}
| INT64 { $$ = strdup("int64"); } | INT64 { }
; ;
string_types: string_types:
STRING { $$ = strdup("string"); } STRING { }
; ;
type: type:
int_types { $$ = $1; } int_types { }
| string_types { $$ = $1; } | string_types { }
; ;
literal: literal:
STRING_LITERAL { $$ = 0; /* Для строк возвращаем 0 */ free_node($1); } STRING_LITERAL { }
| FLOAT_LITERAL { $$ = atof($1); free_node($1); } | FLOAT_LITERAL { }
| NUMBER { $$ = $1; } | NUMBER { }
; ;
arg_declaration: arg_declaration:
IDENTIFIER type { IDENTIFIER type { }
$$ = $2;
printf("Argument: %s %s\n", $1, $2);
free_node($1);
}
; ;
arg_list: arg_list:
@ -124,44 +113,19 @@ arg_list:
; ;
return_type: return_type:
/* empty */ { $$ = NULL; } | type { }
| type { $$ = $1; }
; ;
func_declaration: func_declaration:
FUNC IDENTIFIER LPAREN arg_list RPAREN return_type block { 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);
}
; ;
var_declaration: var_declaration:
IDENTIFIER SHORT_DECLARATION math_expr { IDENTIFIER SHORT_DECLARATION math_expr { }
printf("Short declaration: %s := %g\n", $1, $3); | IDENTIFIER SHORT_DECLARATION literal { }
free_node($1); | VAR IDENTIFIER type { }
} | VAR IDENTIFIER type ASSIGN math_expr { }
| IDENTIFIER SHORT_DECLARATION literal { | VAR IDENTIFIER type ASSIGN 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);
}
; ;
%% %%