From aaa21812f3b31c3debde221abeee05a17a35feb0 Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 1 Apr 2025 20:29:56 +0300 Subject: [PATCH] funcs added --- analyzers/c_analyzer/c_analyzer.l | 5 +++-- analyzers/c_analyzer/c_analyzer.y | 25 ++++++++++++++++++++++++- code.txt | 10 ++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index 0d83a5e..23dd4c9 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -9,8 +9,6 @@ void yyerror(const char *s) { line_number, s, yytext); - - exit(1); } %} @@ -36,6 +34,9 @@ void yyerror(const char *s) { "if" { return IF; } "else" { return ELSE; } +"func" { return FUNC; } +"," { return COMMA; } + "//" { int c; while ((c = input()) != '\n' && c != 0); diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index f55b532..c412d8e 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -17,8 +17,9 @@ bool debug = false; // debug mode %token IDENTIFIER NUMBER %token LBRACE RBRACE LPAREN RPAREN SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT WHILE IF ELSE AND OR NOT +%token FUNC COMMA -%type expr program statement block +%type expr program statement block func_decl param_list params %left OR %left AND @@ -55,6 +56,28 @@ statement: { if (debug) printf("\033[1;34mELSE BLOCK STARTED\033[0m\n"); } block { if (debug) printf("\033[1;34mELSE BLOCK ENDED\033[0m\n"); } + + | func_decl + ; + +func_decl: + FUNC IDENTIFIER { + if (debug) printf("\033[1;35mFUNCTION: %s\033[0m\n", $2); + free($2); + } + LPAREN param_list RPAREN + { if (debug) printf("\033[1;35mFUNCTION PARAMS END\033[0m\n"); } + block + { if (debug) printf("\033[1;35mFUNCTION END\033[0m\n"); } + ; + +param_list: + | params + ; + +params: + IDENTIFIER { if (debug) printf("\033[1;35mPARAM: %s\033[0m\n", $1); free($1); } + | params COMMA IDENTIFIER { if (debug) printf("\033[1;35mPARAM: %s\033[0m\n", $3); free($3); } ; // Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { } diff --git a/code.txt b/code.txt index 5ae8113..58c246f 100644 --- a/code.txt +++ b/code.txt @@ -1,3 +1,13 @@ +func FUNC_1(a, b, c) { + x = x + 1; + a = a + 1; +} + +func FUNC_2() { + x = 5; +} + +func main() { // 123123132 /* test */