65 lines
1.8 KiB
Plaintext
65 lines
1.8 KiB
Plaintext
%{
|
||
#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;
|
||
} |