diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 78ea550..06806db 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -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++; } . { diff --git a/analyzers/test/test.y b/analyzers/test/test.y index a82f697..c898941 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -20,35 +20,50 @@ void free_node(char *str) { } %token IDENTIFIER NUMBER TEXT -%token ASSIGN LBRACE RBRACE +%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON +%token INT +%token VAR -%type expr +%type 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); + } ; %% diff --git a/tests/test_blocks.txt b/tests/test_blocks.txt index 89d6f21..29f7c57 100644 --- a/tests/test_blocks.txt +++ b/tests/test_blocks.txt @@ -1,8 +1,9 @@ -a := 1 +a := 1; { - a := 1 + a := 1; + var a int; { - b := 2 + b := 2; } } \ No newline at end of file