до реализации мат выражений

ilya
serr 2025-05-13 16:50:46 +03:00
parent 76bdf9bb4a
commit f36476bf34
4 changed files with 91 additions and 33 deletions

View File

@ -33,10 +33,15 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
"int64" { return INT64; }
"var" { return VAR; }
"func" { return FUNC; }
"return" { return RETURN; }
":=" { return SHORT_DECLARATION; }
"=" { return ASSIGN; }
"{" { return LBRACE; }
"}" { return RBRACE; }
"(" { return LPAREN; }
")" { return RPAREN; }
"," { return COMMA; }
";" { return SEMICOLON; }
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол

View File

@ -20,15 +20,15 @@ void free_node(char *str) {
}
%token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN
%token VAR
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA
%token VAR FUNC RETURN
%token STRING
%token UINT UINT8 UINT16 UINT32 UINT64
%token INT INT8 INT16 INT32 INT64
%type <str> expr declaration literal
%type <str> var_declaration literal type int_types string_types
%type <str> arg_declaration return_type
%%
@ -38,7 +38,8 @@ program:
statement:
expr SEMICOLON
| declaration SEMICOLON
| var_declaration SEMICOLON
| func_declaration
| block
;
@ -51,61 +52,91 @@ statements_list:
;
expr:
// IDENTIFIER SHORT_DECLARATION NUMBER {
// printf("Short declaration: %s := %s\n", $1, $3);
// free_node($1);
// free_node($3);
// }
// return
RETURN literal
| RETURN IDENTIFIER
//
| IDENTIFIER ASSIGN literal
| IDENTIFIER ASSIGN IDENTIFIER
;
// Типы
// Группирует все возможные типы
int_types:
UINT
| UINT8
| UINT16
| UINT32
| UINT64
| INT
| INT8
| INT16
| INT32
| INT64
UINT { $$ = strdup("uint"); }
| UINT8 { $$ = strdup("uint8"); }
| UINT16 { $$ = strdup("uint16"); }
| UINT32 { $$ = strdup("uint32"); }
| UINT64 { $$ = strdup("uint64"); }
| INT { $$ = strdup("int"); }
| INT8 { $$ = strdup("int8"); }
| INT16 { $$ = strdup("int16"); }
| INT32 { $$ = strdup("int32"); }
| INT64 { $$ = strdup("int64"); }
;
string_types:
STRING
STRING { $$ = strdup("string"); }
;
type:
int_types
| string_types
int_types { $$ = $1; }
| string_types { $$ = $1; }
;
//
// Литералы
literal:
STRING_LITERAL
| FLOAT_LITERAL
| NUMBER
STRING_LITERAL { $$ = $1; }
| FLOAT_LITERAL { $$ = $1; }
| NUMBER { $$ = $1; }
;
// Объявление функций
arg_declaration:
IDENTIFIER type {
$$ = $2; // Возвращаем только тип
printf("Argument: %s %s\n", $1, $2);
free_node($1);
}
;
arg_list:
| arg_declaration
| arg_list COMMA arg_declaration
;
// тип
return_type:
/* empty */ { $$ = NULL; }
| type { $$ = $1; }
;
func_declaration:
FUNC IDENTIFIER LPAREN arg_list RPAREN return_type block {
printf("Function declaration: %s with return type %s\n", $2, $6 ? $6 : "void");
free_node($2);
if ($6) free_node($6);
}
;
//
declaration:
// Объявление переменных
var_declaration:
IDENTIFIER SHORT_DECLARATION literal {
printf("Short declaration: %s := %s\n", $1, $3);
free_node($1);
free_node($3);
}
| VAR IDENTIFIER type {
printf("Variable declaration: var %s type\n", $2);
printf("Variable declaration: var %s %s\n", $2, $3);
free_node($2);
free_node($3);
}
| VAR IDENTIFIER type ASSIGN literal {
printf("Var with assign declaration: var %s type = %s\n", $2, $5);
printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5);
free_node($2);
free_node($3);
free_node($5);
}
;
//
%%

View File

@ -2,6 +2,11 @@ package main
import "fmt"
func test(a string, b int) int {
}
func main() {
test("123", 2)
fmt.Println("hello, sailor!")
}

View File

@ -1,8 +1,25 @@
func test_func(a string, b int, c uint16) int {
var x int = 42;
y := "hello";
}
func func_without_args() int {
return 1;
}
func func_without_return_type(a string) {
return a;
}
a := 1;
{
a := 229.162613;
a = 1;
a = s;
s := "test string";
var a int;