добавил интерфейсы

master2
serr 2025-05-21 00:00:21 +03:00
parent 75058ca1e4
commit b6765464e1
3 changed files with 51 additions and 4 deletions

View File

@ -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; }

View File

@ -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

View File

@ -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
}