доработал return, теперь может быть пустым или возвращать список, добавил условия с присвоением и проверкой

master2
serr 2025-05-18 18:20:05 +03:00
parent d06d314b12
commit 62f411eb2c
6 changed files with 24 additions and 9 deletions

View File

@ -70,6 +70,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
"++" { return INC; } "++" { return INC; }
"--" { return DEC; } "--" { return DEC; }
"range" { return RANGE; }
"for" { return FOR; } "for" { return FOR; }
"break" { return BREAK; } "break" { return BREAK; }
"switch" { return SWITCH; } "switch" { return SWITCH; }

View File

@ -25,7 +25,7 @@ void free_node(char *str) {
%token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL NUMBER PACKAGE IMPORT %token VAR FUNC RETURN STRING_LITERAL FLOAT_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 %token FOR BREAK CONTINUE ARROW IF ELSE RANGE
%token CHAN CONST CASE SWITCH %token CHAN CONST CASE SWITCH
%token PLUS MINUS MULT DIV MOD %token PLUS MINUS MULT DIV MOD
%token STRING %token STRING
@ -78,7 +78,6 @@ block:
LBRACE statements_list RBRACE LBRACE statements_list RBRACE
; ;
any_identifier: any_identifier:
IDENTIFIER IDENTIFIER
| WITH_DOT_IDENTIFIER | WITH_DOT_IDENTIFIER
@ -111,7 +110,8 @@ math_expr_or_literals_list_or_empty:
// condition // condition
condition: condition:
IF log_expr block else_part IF var_multiple_short_declaration SEMICOLON log_expr block else_part
| IF log_expr block else_part
else_part: else_part:
{ printf("\033[1;33mSTATEMENT: if condition with block\033[0m\n"); } { printf("\033[1;33mSTATEMENT: if condition with block\033[0m\n"); }
@ -128,6 +128,8 @@ cicle:
{ printf("\033[1;34mLOOP: full for loop with init, condition and post\033[0m\n"); } { printf("\033[1;34mLOOP: full for loop with init, condition and post\033[0m\n"); }
| FOR log_expr loop_block | FOR log_expr loop_block
{ printf("\033[1;34mLOOP: for loop with condition only\033[0m\n"); } { printf("\033[1;34mLOOP: for loop with condition only\033[0m\n"); }
| FOR identifiers_list SHORT_DECLARATION RANGE IDENTIFIER loop_block
{ printf("\033[1;34mLOOP: range for loop\033[0m\n"); }
; ;
post_statement: post_statement:
@ -187,7 +189,7 @@ continue_statement:
// expressions // expressions
expr: expr:
RETURN math_expr { printf("\033[1;35mRETURN math expr\033[0m\n") } RETURN math_expr_or_literals_list_or_empty { printf("\033[1;35mRETURN math expr\033[0m\n") }
| RETURN literal { printf("\033[1;35mRETURN literal\033[0m\n") } | RETURN literal { printf("\033[1;35mRETURN literal\033[0m\n") }
| IDENTIFIER ASSIGN math_expr { } | IDENTIFIER ASSIGN math_expr { }
| math_expr { } | math_expr { }
@ -221,6 +223,7 @@ log_expr:
| math_expr GEQ math_expr { } | math_expr GEQ math_expr { }
| LPAREN log_expr RPAREN { } | LPAREN log_expr RPAREN { }
| BOOL_LITERAL | BOOL_LITERAL
| func_call
; ;
// //

View File

@ -1,9 +1,13 @@
package main package main
func test(a int) int { import "fmt"
return a
}
func main() { func main() {
panic(test(test(1)*2 + 1))
arr := []int{1, 2, 3}
for idx, val := range arr {
fmt.Println(idx, val)
}
return
} }

View File

@ -66,4 +66,6 @@ outer2:
for key, value := range m { for key, value := range m {
} }
return;
} }

View File

@ -11,4 +11,9 @@ func test(a int) int {
func main() { func main() {
a := test(1); // вызов функции обычной a := test(1); // вызов функции обычной
fmt.Println(test(test(1)*2+3 - a)); // вызов функции из fmt fmt.Println(test(test(1)*2+3 - a)); // вызов функции из fmt
return;
return 1,2,3,a,"123",1.232, test(1)*2;
} }

View File

@ -45,7 +45,7 @@ func main() {
} }
func isValid() bool { func isValid() bool {
return true return true;
} }
func shouldReturn() bool { func shouldReturn() bool {