до реализации мат выражений
parent
76bdf9bb4a
commit
f36476bf34
|
@ -33,10 +33,15 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
"int64" { return INT64; }
|
"int64" { return INT64; }
|
||||||
|
|
||||||
"var" { return VAR; }
|
"var" { return VAR; }
|
||||||
|
"func" { return FUNC; }
|
||||||
|
"return" { return RETURN; }
|
||||||
":=" { return SHORT_DECLARATION; }
|
":=" { return SHORT_DECLARATION; }
|
||||||
"=" { return ASSIGN; }
|
"=" { return ASSIGN; }
|
||||||
"{" { return LBRACE; }
|
"{" { return LBRACE; }
|
||||||
"}" { return RBRACE; }
|
"}" { return RBRACE; }
|
||||||
|
"(" { return LPAREN; }
|
||||||
|
")" { return RPAREN; }
|
||||||
|
"," { return COMMA; }
|
||||||
";" { return SEMICOLON; }
|
";" { return SEMICOLON; }
|
||||||
|
|
||||||
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол
|
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол
|
||||||
|
|
|
@ -20,15 +20,15 @@ void free_node(char *str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
%token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL
|
%token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL
|
||||||
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN
|
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA
|
||||||
%token VAR
|
%token VAR FUNC RETURN
|
||||||
|
|
||||||
%token STRING
|
%token STRING
|
||||||
%token UINT UINT8 UINT16 UINT32 UINT64
|
%token UINT UINT8 UINT16 UINT32 UINT64
|
||||||
%token INT INT8 INT16 INT32 INT64
|
%token INT INT8 INT16 INT32 INT64
|
||||||
|
|
||||||
|
%type <str> var_declaration literal type int_types string_types
|
||||||
%type <str> expr declaration literal
|
%type <str> arg_declaration return_type
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -38,7 +38,8 @@ program:
|
||||||
|
|
||||||
statement:
|
statement:
|
||||||
expr SEMICOLON
|
expr SEMICOLON
|
||||||
| declaration SEMICOLON
|
| var_declaration SEMICOLON
|
||||||
|
| func_declaration
|
||||||
| block
|
| block
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -51,61 +52,91 @@ statements_list:
|
||||||
;
|
;
|
||||||
|
|
||||||
expr:
|
expr:
|
||||||
// IDENTIFIER SHORT_DECLARATION NUMBER {
|
// return
|
||||||
// printf("Short declaration: %s := %s\n", $1, $3);
|
RETURN literal
|
||||||
// free_node($1);
|
| RETURN IDENTIFIER
|
||||||
// free_node($3);
|
//
|
||||||
// }
|
| IDENTIFIER ASSIGN literal
|
||||||
|
| IDENTIFIER ASSIGN IDENTIFIER
|
||||||
;
|
;
|
||||||
|
|
||||||
// Типы
|
|
||||||
// Группирует все возможные типы
|
|
||||||
int_types:
|
int_types:
|
||||||
UINT
|
UINT { $$ = strdup("uint"); }
|
||||||
| UINT8
|
| UINT8 { $$ = strdup("uint8"); }
|
||||||
| UINT16
|
| UINT16 { $$ = strdup("uint16"); }
|
||||||
| UINT32
|
| UINT32 { $$ = strdup("uint32"); }
|
||||||
| UINT64
|
| UINT64 { $$ = strdup("uint64"); }
|
||||||
| INT
|
| INT { $$ = strdup("int"); }
|
||||||
| INT8
|
| INT8 { $$ = strdup("int8"); }
|
||||||
| INT16
|
| INT16 { $$ = strdup("int16"); }
|
||||||
| INT32
|
| INT32 { $$ = strdup("int32"); }
|
||||||
| INT64
|
| INT64 { $$ = strdup("int64"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
string_types:
|
string_types:
|
||||||
STRING
|
STRING { $$ = strdup("string"); }
|
||||||
;
|
;
|
||||||
|
|
||||||
type:
|
type:
|
||||||
int_types
|
int_types { $$ = $1; }
|
||||||
| string_types
|
| string_types { $$ = $1; }
|
||||||
;
|
;
|
||||||
//
|
|
||||||
|
|
||||||
// Литералы
|
|
||||||
literal:
|
literal:
|
||||||
STRING_LITERAL
|
STRING_LITERAL { $$ = $1; }
|
||||||
| FLOAT_LITERAL
|
| FLOAT_LITERAL { $$ = $1; }
|
||||||
| NUMBER
|
| 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 {
|
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 type {
|
| 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($2);
|
||||||
|
free_node($3);
|
||||||
}
|
}
|
||||||
| VAR IDENTIFIER type ASSIGN literal {
|
| 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($2);
|
||||||
|
free_node($3);
|
||||||
|
free_node($5);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
//
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,11 @@ package main
|
||||||
|
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
|
func test(a string, b int) int {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
test("123", 2)
|
||||||
fmt.Println("hello, sailor!")
|
fmt.Println("hello, sailor!")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 := 1;
|
||||||
{
|
{
|
||||||
|
|
||||||
a := 229.162613;
|
a := 229.162613;
|
||||||
|
|
||||||
|
a = 1;
|
||||||
|
a = s;
|
||||||
|
|
||||||
s := "test string";
|
s := "test string";
|
||||||
|
|
||||||
var a int;
|
var a int;
|
||||||
|
|
Loading…
Reference in New Issue