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; }
"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;
}

View File

@ -19,12 +19,16 @@ void free_node(char *str) {
char *str;
}
%token <str> IDENTIFIER NUMBER TEXT
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON
%token INT
%token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN
%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:
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);
}
;

View File

@ -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";
}
}