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 <stdbool.h>
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");