ilya
serr 2025-05-13 15:25:32 +03:00
parent 459da870e9
commit eb474dcd26
3 changed files with 90 additions and 11 deletions

View File

@ -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; } "string" { return STRING; }
"var" { return VAR; }
"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 SHORT_DECLARATION; }
"=" { return ASSIGN; }
"{" { return LBRACE; } "{" { return LBRACE; }
"}" { return RBRACE; } "}" { return RBRACE; }
";" { return SEMICOLON; } ";" { return SEMICOLON; }
[a-zA-Z_][a-zA-Z0-9_]* { \"([^"\\]|\\.)*\" {
yylval.str = strdup(yytext);
return STRING_LITERAL;
}
{LETTER}{LETTER_OR_DIGIT}* {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
return IDENTIFIER; return IDENTIFIER;
} }
[0-9]+ { {DIGIT}+ {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
return NUMBER; return NUMBER;
} }

View File

@ -19,12 +19,16 @@ void free_node(char *str) {
char *str; char *str;
} }
%token <str> IDENTIFIER NUMBER TEXT %token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON %token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN
%token INT
%token VAR %token VAR
%type <str> expr declaration %token STRING
%token UINT UINT8 UINT16 UINT32 UINT64
%token INT INT8 INT16 INT32 INT64
%type <str> 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: declaration:
IDENTIFIER SHORT_DECLARATION NUMBER { IDENTIFIER SHORT_DECLARATION literal {
printf("Short declaration: %s := %s\n", $1, $3); printf("Short declaration: %s := %s\n", $1, $3);
free_node($1); free_node($1);
free_node($3); free_node($3);
} }
| VAR IDENTIFIER INT { | VAR IDENTIFIER type {
printf("Variable declaration: var %s int\n", $2); 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); free_node($2);
} }
; ;

View File

@ -1,9 +1,26 @@
a := 1; a := 1;
{ {
a := 1; a := 1;
s := "test string";
var a int; 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; b := 2;
s := "123";
} }
} }