добавил интерфейсы
parent
75058ca1e4
commit
b6765464e1
|
@ -73,6 +73,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
"++" { return INC; }
|
"++" { return INC; }
|
||||||
"--" { return DEC; }
|
"--" { return DEC; }
|
||||||
|
|
||||||
|
"interface{}" { return INTERFACE_LITERAL; }
|
||||||
"interface" { return INTERFACE; }
|
"interface" { return INTERFACE; }
|
||||||
"map" { return MAP; }
|
"map" { return MAP; }
|
||||||
"struct" { return STRUCT; }
|
"struct" { return STRUCT; }
|
||||||
|
|
|
@ -25,7 +25,7 @@ void free_node(char *str) {
|
||||||
%token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT
|
%token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT
|
||||||
%token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ
|
%token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ
|
||||||
%token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ
|
%token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ
|
||||||
%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP CHAN INTERFACE
|
%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER GO TYPE STRUCT MAP CHAN INTERFACE INTERFACE_LITERAL
|
||||||
%token CHAN CONST CASE SWITCH MAKE
|
%token CHAN CONST CASE SWITCH MAKE
|
||||||
%token PLUS MINUS MULT DIV MOD
|
%token PLUS MINUS MULT DIV MOD
|
||||||
%token STRING
|
%token STRING
|
||||||
|
@ -70,6 +70,7 @@ statement:
|
||||||
| any_identifier ASSIGN math_expr SEMICOLON
|
| any_identifier ASSIGN math_expr SEMICOLON
|
||||||
| any_identifier ASSIGN literal SEMICOLON
|
| any_identifier ASSIGN literal SEMICOLON
|
||||||
| var_multiple_short_assignment SEMICOLON
|
| var_multiple_short_assignment SEMICOLON
|
||||||
|
| TYPE IDENTIFIER interface_declaration SEMICOLON
|
||||||
| func_declaration
|
| func_declaration
|
||||||
{ printf("\033[1;33mSTATEMENT: function declaration\033[0m\n"); }
|
{ printf("\033[1;33mSTATEMENT: function declaration\033[0m\n"); }
|
||||||
| type_delcaration SEMICOLON
|
| type_delcaration SEMICOLON
|
||||||
|
@ -244,6 +245,7 @@ math_expr:
|
||||||
| LPAREN { printf("LPAREN\n"); } math_expr RPAREN { printf("RPAREN\n"); }
|
| LPAREN { printf("LPAREN\n"); } math_expr RPAREN { printf("RPAREN\n"); }
|
||||||
| NUMBER { printf("NUMBER\n"); }
|
| NUMBER { printf("NUMBER\n"); }
|
||||||
| FLOAT_LITERAL { printf("FLOAT LITERAL\n"); }
|
| FLOAT_LITERAL { printf("FLOAT LITERAL\n"); }
|
||||||
|
| INTERFACE_LITERAL { printf("INTERFACE LITERAL\n"); }
|
||||||
| COMPLEX_LITERAL { printf("COMPLEX LITERAL\n"); }
|
| COMPLEX_LITERAL { printf("COMPLEX LITERAL\n"); }
|
||||||
| make { printf("make\n"); }
|
| make { printf("make\n"); }
|
||||||
| any_identifier { printf("IDENTIFIER\n"); }
|
| any_identifier { printf("IDENTIFIER\n"); }
|
||||||
|
@ -272,7 +274,7 @@ log_expr:
|
||||||
// types
|
// types
|
||||||
|
|
||||||
interface_types:
|
interface_types:
|
||||||
INTERFACE {printf("INTERFACE\n"); } LBRACE interface_declarate_field_list RBRACE
|
INTERFACE_LITERAL
|
||||||
|
|
||||||
struct_types:
|
struct_types:
|
||||||
STRUCT LBRACE declarate_field_list RBRACE
|
STRUCT LBRACE declarate_field_list RBRACE
|
||||||
|
@ -337,6 +339,7 @@ literal:
|
||||||
| arr_literal { }
|
| arr_literal { }
|
||||||
| struct_literal { }
|
| struct_literal { }
|
||||||
| func_literal { }
|
| func_literal { }
|
||||||
|
| INTERFACE_LITERAL
|
||||||
| COMPLEX_LITERAL { }
|
| COMPLEX_LITERAL { }
|
||||||
| BOOL_LITERAL { }
|
| BOOL_LITERAL { }
|
||||||
| FLOAT_LITERAL { }
|
| FLOAT_LITERAL { }
|
||||||
|
@ -467,6 +470,8 @@ map_element:
|
||||||
| IDENTIFIER LBRACK any_identifier RBRACK
|
| IDENTIFIER LBRACK any_identifier RBRACK
|
||||||
|
|
||||||
// interface
|
// interface
|
||||||
|
interface_declaration:
|
||||||
|
INTERFACE {printf("INTERFACE\n"); } LBRACE interface_declarate_field_list RBRACE
|
||||||
|
|
||||||
interface_field:
|
interface_field:
|
||||||
IDENTIFIER LPAREN arg_list RPAREN {printf("ret type interface\n");} return_type
|
IDENTIFIER LPAREN arg_list RPAREN {printf("ret type interface\n");} return_type
|
||||||
|
@ -497,7 +502,8 @@ struct_literal:
|
||||||
any_identifier LBRACE field_list RBRACE { printf("STRUCT LITERAL\n"); }
|
any_identifier LBRACE field_list RBRACE { printf("STRUCT LITERAL\n"); }
|
||||||
| any_identifier LBRACE math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); }
|
| any_identifier LBRACE math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); }
|
||||||
|
|
||||||
// chan
|
//
|
||||||
|
|
||||||
chan_types:
|
chan_types:
|
||||||
CHAN type
|
CHAN type
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,46 @@
|
||||||
package main;
|
package main;
|
||||||
|
import "fmt";
|
||||||
|
|
||||||
type test interface{
|
type test interface{
|
||||||
a(a int) (a, b int);
|
a(a int) (a, b int);
|
||||||
b() (a, b int, string);
|
b() (a, b int, string);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Vehicle interface{
|
||||||
|
move();
|
||||||
|
};
|
||||||
|
|
||||||
|
func drive(vehicle Vehicle){
|
||||||
|
vehicle.move();
|
||||||
|
}
|
||||||
|
|
||||||
|
type Car struct{ };
|
||||||
|
type Aircraft struct{};
|
||||||
|
|
||||||
|
func (c Car) move(){
|
||||||
|
fmt.Println("Автомобиль едет");
|
||||||
|
}
|
||||||
|
func (a Aircraft) move(){
|
||||||
|
fmt.Println("Самолет летит");
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
tesla := Car{};
|
||||||
|
boing := Aircraft{};
|
||||||
|
drive(tesla);
|
||||||
|
drive(boing);
|
||||||
|
|
||||||
|
var anything interface{}; // Пустой интерфейс
|
||||||
|
|
||||||
|
b := interface{}; // short decl
|
||||||
|
|
||||||
|
anything = 42;
|
||||||
|
fmt.Printf("Тип: %T, Значение: %v\n", anything, anything); // int, 42
|
||||||
|
|
||||||
|
anything = "hello";
|
||||||
|
fmt.Printf("Тип: %T, Значение: %v\n", anything, anything); // string, hello
|
||||||
|
|
||||||
|
anything = 3.14;
|
||||||
|
fmt.Printf("Тип: %T, Значение: %v\n", anything, anything); // float64, 3.14
|
||||||
|
}
|
Loading…
Reference in New Issue