func calls added

master
serr 2025-04-01 22:01:24 +03:00
parent 8eabecb7b1
commit f977efc3a4
2 changed files with 19 additions and 3 deletions

View File

@ -20,7 +20,7 @@ char* path;
%token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE DO FOR IF ELSE AND OR NOT LT GT EQ
%token FUNC COMMA
%type <str> expr program statement block func_decl param_list params
%type <str> expr_list expr program statement block func_decl param_list params
%left OR
%left AND
@ -52,7 +52,7 @@ statement:
| DO { if (debug) printf("\033[1;34mDO-WHILE LOOP DETECTED\033[0m\n"); }
block
WHILE
{ printf("\033[1;34mDO-WHILE CONDITION DETECTED\033[0m\n"); }
{ if (debug) printf("\033[1;34mDO-WHILE CONDITION DETECTED\033[0m\n"); }
LPAREN expr RPAREN SEMICOLON
{ if (debug) printf("\033[1;34mDO-WHILE LOOP ENDED\033[0m\n"); }
@ -101,6 +101,12 @@ block:
LBRACE program RBRACE
;
// Список выражений (для вызова функции)
expr_list:
| expr
| expr_list COMMA expr
;
// Возможные выражения
expr:
RET { if (debug) printf("RET\n") } expr // выражение вида return expr
@ -123,6 +129,12 @@ expr:
| NOT { if (debug) printf("NOT\n") } expr
| IDENTIFIER { if (debug) printf("IDENTIFIER(%s)\n", $1); free($1); }
| NUMBER { if (debug) printf("NUMBER(%s)\n", $1); free($1); }
| IDENTIFIER { if (debug) printf("\033[1;35mIDENTIFIER(%s)\n\033[0m", $1); free($1); }
LPAREN { if (debug) printf("\033[1;35mSTART FUNC CALL\n\033[0m"); }
expr_list
RPAREN { if (debug) printf("\033[1;35mEND FUNC CALL\n\033[0m"); }
;
;
%%

View File

@ -5,10 +5,14 @@ func FUNC_1(a, b, c) {
}
x = x + 1;
a = a + 1;;
a = a + 1;
}
func FUNC_2() {
FUNC_1(1%123,(2-8)*2+2,3*5); // math expr in args
FUNC_1(1,2,FUNC_1(1,2,3)); // composition
do {
x = x + 1;
} while(x < 5);