diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 653093e..73595e5 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -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; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index bc83f6b..9aad94e 100644 --- a/analyzers/test/test.y +++ b/analyzers/test/test.y @@ -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 diff --git a/tests/test_interfaces.txt b/tests/test_interfaces.txt index fc6bfc1..bee1ead 100644 --- a/tests/test_interfaces.txt +++ b/tests/test_interfaces.txt @@ -1,6 +1,46 @@ package main; +import "fmt"; type test interface{ a(a int) (a, b int); b() (a, b int, string); -}; \ No newline at end of file +}; + +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 +} \ No newline at end of file