var declaration

ilya
serr 2025-05-13 14:39:13 +03:00
parent 32ac19d671
commit 459da870e9
3 changed files with 41 additions and 19 deletions

View File

@ -15,6 +15,14 @@ void yyerror(const char *s) {
%% %%
"int" { return INT; }
"var" { return VAR; }
":=" { return SHORT_DECLARATION; }
"{" { return LBRACE; }
"}" { return RBRACE; }
";" { return SEMICOLON; }
[a-zA-Z_][a-zA-Z0-9_]* { [a-zA-Z_][a-zA-Z0-9_]* {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
return IDENTIFIER; return IDENTIFIER;
@ -23,9 +31,7 @@ void yyerror(const char *s) {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
return NUMBER; return NUMBER;
} }
":=" { return ASSIGN; }
"{" { return LBRACE; }
"}" { return RBRACE; }
[ \t]+ ; // Пропускаем пробелы и табы [ \t]+ ; // Пропускаем пробелы и табы
\n { CURRENT_LINE_NUMBER++; } \n { CURRENT_LINE_NUMBER++; }
. { . {

View File

@ -20,35 +20,50 @@ void free_node(char *str) {
} }
%token <str> IDENTIFIER NUMBER TEXT %token <str> IDENTIFIER NUMBER TEXT
%token ASSIGN LBRACE RBRACE %token SHORT_DECLARATION LBRACE RBRACE SEMICOLON
%token INT
%token VAR
%type <str> expr %type <str> expr declaration
%% %%
program: program:
| program expr | program statement
| program block ;
statement:
expr SEMICOLON
| declaration SEMICOLON
| block
; ;
block: block:
LBRACE content RBRACE LBRACE statements_list RBRACE
; ;
content: statements_list:
| content TEXT { | statements_list statement
printf("TEXT: '%s'\n", $2);
free_node($2); }
| content block
| content expr
; ;
expr: expr:
IDENTIFIER ASSIGN NUMBER { // IDENTIFIER SHORT_DECLARATION NUMBER {
printf("Assignment: %s := %s\n", $1, $3); // printf("Short declaration: %s := %s\n", $1, $3);
// free_node($1);
// free_node($3);
// }
;
declaration:
IDENTIFIER SHORT_DECLARATION NUMBER {
printf("Short declaration: %s := %s\n", $1, $3);
free_node($1); free_node($1);
free_node($3); free_node($3);
} }
| VAR IDENTIFIER INT {
printf("Variable declaration: var %s int\n", $2);
free_node($2);
}
; ;
%% %%

View File

@ -1,8 +1,9 @@
a := 1 a := 1;
{ {
a := 1 a := 1;
var a int;
{ {
b := 2 b := 2;
} }
} }