diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index b288a74..f67ba6b 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -5,7 +5,7 @@ int line_number = 1; void yyerror(const char *s) { fprintf(stderr, - "\033[91mError at line %i: %s near '%s'\033[0m\n", + "\033[91m\nError at line %i: %s near '%s'\033[0m\n", line_number, s, yytext); @@ -24,6 +24,7 @@ void yyerror(const char *s) { "-" { return MINUS; } "*" { return MULT; } "/" { return DIV; } +"%" { return MOD; } "return" { return RET; } "print" { return PRINT; } [0-9]+ { yylval.str = strdup(yytext); return NUMBER; } diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index 90c0cf7..0c1eeb5 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -1,10 +1,9 @@ %{ #include -extern char *yytext; - void yyerror(const char *s); extern int yylex(); +extern char *yytext; extern FILE *yyin; %} @@ -12,8 +11,8 @@ extern FILE *yyin; char *str; } -%token IDENTIFIER NUMBER RET PRINT -%token LBRACE RBRACE SEMICOLON ASSIGN PLUS MINUS MULT DIV +%token IDENTIFIER NUMBER +%token LBRACE RBRACE SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT %type expr program statement block @@ -26,7 +25,7 @@ program: // Утверждение - либо блок {...}, либо выражение с ; в конце statement: - expr SEMICOLON + { printf("\033[93m\nANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON | block ; @@ -44,6 +43,7 @@ expr: | expr MINUS expr // выражения вида expr-expr | expr MULT expr // выражения вида expr*expr | expr DIV expr // выражения вида expr/expr + | expr MOD expr // выражения вида expr%expr | IDENTIFIER { printf("IDENTIFIER = %s\n", $1); free($1); } | NUMBER { printf("NUMBER = %s\n", $1); free($1); } ; @@ -60,6 +60,6 @@ int main(int argc, char **argv) { yyin = f; } yyparse(); - printf("\033[92mSuccess parsed!\033[0m"); + printf("\033[92m\nSuccess parsed!\033[0m"); return 0; } \ No newline at end of file diff --git a/code.txt b/code.txt index 5461d51..96902b3 100644 --- a/code.txt +++ b/code.txt @@ -3,7 +3,7 @@ x = z + 3 + 5; { x = 10; - y = x + 5; + y = x + 5 % 2; { z = y * 2 / 5 * 3; }