var declaration
parent
32ac19d671
commit
459da870e9
|
@ -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++; }
|
||||||
. {
|
. {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
a := 1
|
a := 1;
|
||||||
{
|
{
|
||||||
a := 1
|
a := 1;
|
||||||
|
var a int;
|
||||||
{
|
{
|
||||||
|
|
||||||
b := 2
|
b := 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue