добавил интерфейсы
parent
75058ca1e4
commit
b6765464e1
|
@ -73,6 +73,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
|||
"++" { return INC; }
|
||||
"--" { return DEC; }
|
||||
|
||||
"interface{}" { return INTERFACE_LITERAL; }
|
||||
"interface" { return INTERFACE; }
|
||||
"map" { return MAP; }
|
||||
"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 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 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 PLUS MINUS MULT DIV MOD
|
||||
%token STRING
|
||||
|
@ -70,6 +70,7 @@ statement:
|
|||
| any_identifier ASSIGN math_expr SEMICOLON
|
||||
| any_identifier ASSIGN literal SEMICOLON
|
||||
| var_multiple_short_assignment SEMICOLON
|
||||
| TYPE IDENTIFIER interface_declaration SEMICOLON
|
||||
| func_declaration
|
||||
{ printf("\033[1;33mSTATEMENT: function declaration\033[0m\n"); }
|
||||
| type_delcaration SEMICOLON
|
||||
|
@ -244,6 +245,7 @@ math_expr:
|
|||
| LPAREN { printf("LPAREN\n"); } math_expr RPAREN { printf("RPAREN\n"); }
|
||||
| NUMBER { printf("NUMBER\n"); }
|
||||
| FLOAT_LITERAL { printf("FLOAT LITERAL\n"); }
|
||||
| INTERFACE_LITERAL { printf("INTERFACE LITERAL\n"); }
|
||||
| COMPLEX_LITERAL { printf("COMPLEX LITERAL\n"); }
|
||||
| make { printf("make\n"); }
|
||||
| any_identifier { printf("IDENTIFIER\n"); }
|
||||
|
@ -272,7 +274,7 @@ log_expr:
|
|||
// types
|
||||
|
||||
interface_types:
|
||||
INTERFACE {printf("INTERFACE\n"); } LBRACE interface_declarate_field_list RBRACE
|
||||
INTERFACE_LITERAL
|
||||
|
||||
struct_types:
|
||||
STRUCT LBRACE declarate_field_list RBRACE
|
||||
|
@ -337,6 +339,7 @@ literal:
|
|||
| arr_literal { }
|
||||
| struct_literal { }
|
||||
| func_literal { }
|
||||
| INTERFACE_LITERAL
|
||||
| COMPLEX_LITERAL { }
|
||||
| BOOL_LITERAL { }
|
||||
| FLOAT_LITERAL { }
|
||||
|
@ -467,6 +470,8 @@ map_element:
|
|||
| IDENTIFIER LBRACK any_identifier RBRACK
|
||||
|
||||
// interface
|
||||
interface_declaration:
|
||||
INTERFACE {printf("INTERFACE\n"); } LBRACE interface_declarate_field_list RBRACE
|
||||
|
||||
interface_field:
|
||||
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 math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); }
|
||||
|
||||
// chan
|
||||
//
|
||||
|
||||
chan_types:
|
||||
CHAN type
|
||||
|
||||
|
|
|
@ -1,6 +1,46 @@
|
|||
package main;
|
||||
import "fmt";
|
||||
|
||||
type test interface{
|
||||
a(a int) (a, b int);
|
||||
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