flex-bison-in-action/analyzers/c_analyzer/c_analyzer.y

65 lines
1.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

%{
#include <stdio.h>
void yyerror(const char *s);
extern int yylex();
extern char *yytext;
extern FILE *yyin;
%}
%union {
char *str;
}
%token <str> IDENTIFIER NUMBER
%token LBRACE RBRACE SEMICOLON ASSIGN PLUS MINUS MULT DIV MOD RET PRINT
%type <str> expr program statement block
%%
// Program - последовательность утверждений
program:
| program statement
;
// Утверждение - либо блок {...}, либо выражение с ; в конце
statement:
{ printf("\033[93m\nANOTHER STATEMENT\n\033[0m"); } expr SEMICOLON
| block
;
// Блок - { program }, т.е. это последовательность утверждений и она находится в скобках { }
block:
LBRACE program RBRACE
;
// Возможные выражения
expr:
RET expr // выражение вида return expr
| PRINT expr // выражение вида print expr
| IDENTIFIER ASSIGN expr // выражения вида a=expr
| expr PLUS expr // выражения вида expr+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); }
;
%%
int main(int argc, char **argv) {
if (argc > 1) {
FILE *f = fopen(argv[1], "r");
if (!f) {
perror("\033[91mFail open file\033[0m");
return 1;
}
yyin = f;
}
yyparse();
printf("\033[92m\nSuccess parsed!\033[0m");
return 0;
}