diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 06806db..b5d1d2c 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -13,21 +13,43 @@ void yyerror(const char *s) { %} +DIGIT [0-9] +LETTER [a-zA-Z_] +LETTER_OR_DIGIT [a-zA-Z0-9_] + %% -"int" { return INT; } -"var" { return VAR; } +"string" { return STRING; } +"uint" { return UINT; } +"uint8" { return UINT8; } +"uint16" { return UINT16; } +"uint32" { return UINT32; } +"uint64" { return UINT64; } + +"int" { return INT; } +"int8" { return INT8; } +"int16" { return INT16; } +"int32" { return INT32; } +"int64" { return INT64; } + +"var" { return VAR; } ":=" { return SHORT_DECLARATION; } +"=" { return ASSIGN; } "{" { return LBRACE; } "}" { return RBRACE; } ";" { return SEMICOLON; } -[a-zA-Z_][a-zA-Z0-9_]* { +\"([^"\\]|\\.)*\" { + yylval.str = strdup(yytext); + return STRING_LITERAL; +} + +{LETTER}{LETTER_OR_DIGIT}* { yylval.str = strdup(yytext); return IDENTIFIER; } -[0-9]+ { +{DIGIT}+ { yylval.str = strdup(yytext); return NUMBER; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index c898941..1dbee70 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -19,12 +19,16 @@ void free_node(char *str) { char *str; } -%token IDENTIFIER NUMBER TEXT -%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON -%token INT +%token IDENTIFIER NUMBER TEXT STRING_LITERAL +%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN %token VAR -%type expr declaration +%token STRING +%token UINT UINT8 UINT16 UINT32 UINT64 +%token INT INT8 INT16 INT32 INT64 + + +%type expr declaration literal %% @@ -54,14 +58,50 @@ expr: // } ; +// Типы +// Группирует все возможные типы +int_types: + UINT + | UINT8 + | UINT16 + | UINT32 + | UINT64 + | INT + | INT8 + | INT16 + | INT32 + | INT64 + ; + +string_types: + STRING + ; + +type: + int_types + | string_types + ; +// + +// Литералы +literal: + STRING_LITERAL + | NUMBER + ; +// + declaration: - IDENTIFIER SHORT_DECLARATION NUMBER { + IDENTIFIER SHORT_DECLARATION literal { 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); + | VAR IDENTIFIER type { + printf("Variable declaration: var %s type\n", $2); + free_node($2); + } + | VAR IDENTIFIER type ASSIGN literal { + printf("Var with assign declaration: var %s type = %s\n", $2, $5); free_node($2); } ; diff --git a/tests/test_blocks.txt b/tests/test_blocks.txt index 29f7c57..b6d91ca 100644 --- a/tests/test_blocks.txt +++ b/tests/test_blocks.txt @@ -1,9 +1,26 @@ a := 1; { + a := 1; + + s := "test string"; + var a int; + var a int8; + var a int16; + var a int32; + var a int64; + var a uint8; + var a uint16; + var a uint32; + var a uint64; + + var a string = "123123"; { b := 2; + + + s := "123"; } } \ No newline at end of file