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_]* {
|
||||
yylval.str = strdup(yytext);
|
||||
return IDENTIFIER;
|
||||
|
@ -23,9 +31,7 @@ void yyerror(const char *s) {
|
|||
yylval.str = strdup(yytext);
|
||||
return NUMBER;
|
||||
}
|
||||
":=" { return ASSIGN; }
|
||||
"{" { return LBRACE; }
|
||||
"}" { return RBRACE; }
|
||||
|
||||
[ \t]+ ; // Пропускаем пробелы и табы
|
||||
\n { CURRENT_LINE_NUMBER++; }
|
||||
. {
|
||||
|
|
|
@ -20,35 +20,50 @@ void free_node(char *str) {
|
|||
}
|
||||
|
||||
%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 expr
|
||||
| program block
|
||||
| program statement
|
||||
;
|
||||
|
||||
statement:
|
||||
expr SEMICOLON
|
||||
| declaration SEMICOLON
|
||||
| block
|
||||
;
|
||||
|
||||
block:
|
||||
LBRACE content RBRACE
|
||||
LBRACE statements_list RBRACE
|
||||
;
|
||||
|
||||
content:
|
||||
| content TEXT {
|
||||
printf("TEXT: '%s'\n", $2);
|
||||
free_node($2); }
|
||||
| content block
|
||||
| content expr
|
||||
statements_list:
|
||||
| statements_list statement
|
||||
;
|
||||
|
||||
expr:
|
||||
IDENTIFIER ASSIGN NUMBER {
|
||||
printf("Assignment: %s := %s\n", $1, $3);
|
||||
// IDENTIFIER SHORT_DECLARATION NUMBER {
|
||||
// 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($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