diff --git a/analyzers/test/test.l b/analyzers/test/test.l index 841a065..0b1249b 100644 --- a/analyzers/test/test.l +++ b/analyzers/test/test.l @@ -72,6 +72,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_] "++" { return INC; } "--" { return DEC; } +"defer" { return DEFER; } "range" { return RANGE; } "for" { return FOR; } "break" { return BREAK; } diff --git a/analyzers/test/test.y b/analyzers/test/test.y index f9736be..e824853 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 +%token FOR BREAK CONTINUE ARROW IF ELSE RANGE DEFER %token CHAN CONST CASE SWITCH %token PLUS MINUS MULT DIV MOD %token STRING @@ -58,6 +58,7 @@ program: ; statement: + | DEFER func_call SEMICOLON | func_call SEMICOLON { printf("\033[1;33mSTATEMENT: func_call\033[0m\n"); } | var_declaration SEMICOLON @@ -329,11 +330,12 @@ import_list: func_literal: FUNC { printf("\033[1;35mHELLO, ANON FUNC\n\033[0m"); } - LPAREN arg_list RPAREN return_type block + LPAREN arg_list RPAREN return_type block { printf("\033[1;35mBY, ANON FUNC\n\n\033[0m"); } func_call: any_identifier LPAREN math_expr_or_literals_list_or_empty RPAREN + | func_literal LPAREN math_expr_or_literals_list_or_empty RPAREN arg_declaration: identifiers_list type diff --git a/tests/main.go b/tests/main.go index f53f07d..74b8624 100644 --- a/tests/main.go +++ b/tests/main.go @@ -1,6 +1,9 @@ package main -import "fmt" +import ( + "fmt" + "log" +) func ujas() (func() func() func() int, int, string) { return func() func() func() int { @@ -19,5 +22,15 @@ func main() { fmt.Println(idx, val) } + defer func() { + if err := recover(); err != nil { + log.Println("work failed:", err) + } + }() + + func(msg string) { + fmt.Println("Message:", msg) + }("Hello, IIFE!") + return } diff --git a/tests/test_funcs.txt b/tests/test_funcs.txt index a384878..ded0398 100644 --- a/tests/test_funcs.txt +++ b/tests/test_funcs.txt @@ -2,6 +2,27 @@ package main; import "fmt"; +func server(a int) { + for work := range workChan { + + } +} + +func iife(work int) { + + func(){}(); + func(){fmt.Println(123);}(); + + func(a, b string) { + fmt.Println("Message:", a + b); + }("Hello", ", world!"); + + defer func() { + if err := recover(); err != nil { + log.Println("work failed:", err); + } + }(); +} func ujas() (func() func() func() int, int, string) { return func() func() func() int {