diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index 5100365..28e5238 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -1,10 +1,14 @@ %{ #include +#include void yyerror(const char *s); extern int yylex(); extern char *yytext; extern FILE *yyin; + +bool debug = false; // debug mode + %} %union { @@ -29,13 +33,13 @@ program: // Утверждение - либо блок {...}, либо выражение с ; в конце statement: - { printf("\033[93mANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON + { if (debug) printf("\033[93mANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON | block - | WHILE { printf("\033[1;34m>>> WHILE LOOP DETECTED\033[0m\n"); } + | WHILE { if (debug) printf("\033[1;34mWHILE LOOP DETECTED\033[0m\n"); } LPAREN expr RPAREN - { printf("\033[1;34m>>> WHILE BODY STARTS\033[0m\n"); } + { if (debug) printf("\033[1;34mWHILE BODY STARTS\033[0m\n"); } block - { printf("\033[1;34m>>> WHILE LOOP ENDED\033[0m\n"); } + { if (debug) printf("\033[1;34mWHILE LOOP ENDED\033[0m\n"); } ; // Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { } @@ -45,31 +49,46 @@ block: // Возможные выражения expr: - RET { printf("RET\n") } expr // выражение вида return expr - | PLUS { printf("UNARY PLUS\n"); } expr %prec UNARY // выражение вида +expr - | MINUS { printf("UNARY MINUS\n"); } expr %prec UNARY // выражение вида -expr - | PRINT { printf("PRINT\n") } expr // выражение вида print expr - | IDENTIFIER { printf("IDENTIFIER(%s)\n", $1); free($1); } ASSIGN { printf("ASSIGN\n"); } expr // выражения вида a=expr - | expr PLUS { printf("PLUS\n") } expr // выражения вида expr+expr - | expr MINUS { printf("MINUS\n") } expr // выражения вида expr-expr - | expr MULT { printf("MULT\n") } expr // выражения вида expr*expr - | expr DIV { printf("DIV\n") } expr // выражения вида expr/expr - | expr MOD { printf("MOD\n") } expr // выражения вида expr%expr - | LPAREN { printf("LPAREN\n") } expr RPAREN { printf("RPAREN\n") } // выражения вида (expr) - | IDENTIFIER { printf("IDENTIFIER(%s)\n", $1); free($1); } - | NUMBER { printf("NUMBER(%s)\n", $1); free($1); } + RET { if (debug) printf("RET\n") } expr // выражение вида return expr + | PLUS { if (debug) printf("UNARY PLUS\n"); } expr %prec UNARY // выражение вида +expr + | MINUS { if (debug) printf("UNARY MINUS\n"); } expr %prec UNARY // выражение вида -expr + | PRINT { if (debug) printf("PRINT\n") } expr // выражение вида print expr + | IDENTIFIER { if (debug) printf("IDENTIFIER(%s)\n", $1); free($1); } // выражения вида a=expr + ASSIGN { if (debug) printf("ASSIGN\n"); } expr + | expr PLUS { if (debug) printf("PLUS\n") } expr // выражения вида expr+expr + | expr MINUS { if (debug) printf("MINUS\n") } expr // выражения вида expr-expr + | expr MULT { if (debug) printf("MULT\n") } expr // выражения вида expr*expr + | expr DIV { if (debug) printf("DIV\n") } expr // выражения вида expr/expr + | expr MOD { if (debug) printf("MOD\n") } expr // выражения вида expr%expr + | LPAREN { if (debug) printf("LPAREN\n") } expr RPAREN { if (debug) printf("RPAREN\n") } // выражения вида (expr) + | IDENTIFIER { if (debug) printf("IDENTIFIER(%s)\n", $1); free($1); } + | NUMBER { if (debug) printf("NUMBER(%s)\n", $1); free($1); } ; %% int main(int argc, char **argv) { if (argc > 1) { - FILE *f = fopen(argv[1], "r"); + char* path; + + // debug mode + if (argc > 2) { + path = argv[2]; + if (!strcmp(argv[1], "-d")) { + debug = true; + } + } else { + path = argv[1]; + } + + // default mode + FILE *f = fopen(path, "r"); if (!f) { perror("\033[91mFail open file\033[0m"); return 1; } yyin = f; + } yyparse(); printf("\033[92m\nGood code\033[0m");