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