до убирания ненужных стрдапов и тд

ilya
serr 2025-05-13 17:10:26 +03:00
parent f36476bf34
commit f5f9256e8f
4 changed files with 67 additions and 22 deletions

View File

@ -37,6 +37,11 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
"return" { return RETURN; } "return" { return RETURN; }
":=" { return SHORT_DECLARATION; } ":=" { return SHORT_DECLARATION; }
"=" { return ASSIGN; } "=" { return ASSIGN; }
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return MULT; }
"/" { return DIV; }
"%" { return MOD; }
"{" { return LBRACE; } "{" { return LBRACE; }
"}" { return RBRACE; } "}" { return RBRACE; }
"(" { return LPAREN; } "(" { return LPAREN; }
@ -45,7 +50,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
";" { return SEMICOLON; } ";" { return SEMICOLON; }
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол \"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол
yylval.str = strdup(yytext); // yylval.str = strdup(yytext);
return STRING_LITERAL; return STRING_LITERAL;
} }
@ -60,7 +65,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
} }
{DIGIT}+ { {DIGIT}+ {
yylval.str = strdup(yytext); yylval.num = atoi(yytext);
return NUMBER; return NUMBER;
} }

View File

@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <math.h>
extern int yylineno; extern int yylineno;
extern char *yytext; extern char *yytext;
@ -17,18 +18,27 @@ void free_node(char *str) {
%union { %union {
char *str; char *str;
double num;
} }
%token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL
%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
%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
%type <str> var_declaration literal type int_types string_types
%token <str> IDENTIFIER STRING_LITERAL FLOAT_LITERAL
%type <str> var_declaration type int_types string_types
%type <str> arg_declaration return_type %type <str> arg_declaration return_type
%type <num> expr literal math_expr
%token <num> NUMBER
%left PLUS MINUS
%left MULT DIV MOD
%left EXP
%left UMINUS
%% %%
@ -52,14 +62,26 @@ statements_list:
; ;
expr: expr:
// return RETURN math_expr { printf("Return: %g\n", $2); }
RETURN literal | IDENTIFIER ASSIGN math_expr { printf("Assignment: %s = %g\n", $1, $3); free_node($1); }
| RETURN IDENTIFIER | math_expr { $$ = $1; }
//
| IDENTIFIER ASSIGN literal
| IDENTIFIER ASSIGN IDENTIFIER
; ;
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: int_types:
UINT { $$ = strdup("uint"); } UINT { $$ = strdup("uint"); }
| UINT8 { $$ = strdup("uint8"); } | UINT8 { $$ = strdup("uint8"); }
@ -83,15 +105,14 @@ type:
; ;
literal: literal:
STRING_LITERAL { $$ = $1; } STRING_LITERAL { $$ = 0; /* Для строк возвращаем 0 */ free_node($1); }
| FLOAT_LITERAL { $$ = $1; } | FLOAT_LITERAL { $$ = atof($1); free_node($1); }
| NUMBER { $$ = $1; } | NUMBER { $$ = $1; }
; ;
// Объявление функций
arg_declaration: arg_declaration:
IDENTIFIER type { IDENTIFIER type {
$$ = $2; // Возвращаем только тип $$ = $2;
printf("Argument: %s %s\n", $1, $2); printf("Argument: %s %s\n", $1, $2);
free_node($1); free_node($1);
} }
@ -102,7 +123,6 @@ arg_list:
| arg_list COMMA arg_declaration | arg_list COMMA arg_declaration
; ;
// тип
return_type: return_type:
/* empty */ { $$ = NULL; } /* empty */ { $$ = NULL; }
| type { $$ = $1; } | type { $$ = $1; }
@ -115,11 +135,13 @@ func_declaration:
if ($6) free_node($6); if ($6) free_node($6);
} }
; ;
//
// Объявление переменных
var_declaration: 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); printf("Short declaration: %s := %s\n", $1, $3);
free_node($1); free_node($1);
free_node($3); free_node($3);
@ -129,6 +151,11 @@ var_declaration:
free_node($2); free_node($2);
free_node($3); 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 { | VAR IDENTIFIER type ASSIGN literal {
printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5); printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5);
free_node($2); free_node($2);
@ -136,7 +163,6 @@ var_declaration:
free_node($5); free_node($5);
} }
; ;
//
%% %%

View File

@ -12,7 +12,7 @@ func func_without_return_type(a string) {
return a; return a;
} }
a := 1; a := 1 + 2;
{ {
a := 229.162613; a := 229.162613;
@ -35,7 +35,7 @@ a := 1;
var a string = "123123"; var a string = "123123";
{ {
b := 2; b := 2 - 1;
s := "123"; s := "123";

14
tests/test_math.txt Normal file
View File

@ -0,0 +1,14 @@
func test() {
return a;
}
func main() {
var a int;
a = 2+2*2-(1+10);
a = a + 1;
a = a;
}