debug mode added

master
serr 2025-04-01 19:03:46 +03:00
parent fe86d2cc29
commit 0383536363
1 changed files with 37 additions and 18 deletions

View File

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