debug mode added
parent
fe86d2cc29
commit
0383536363
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue