From f3023ba5f48d6a8a3be130b9c6c30069f332d1fa Mon Sep 17 00:00:00 2001 From: serr Date: Sun, 30 Mar 2025 17:51:29 +0300 Subject: [PATCH] calc test --- .gitignore | 1 + analyzers/calc.l | 12 ++++++++++++ analyzers/calc.y | 33 +++++++++++++++++++++++++++++++++ main.py | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 .gitignore create mode 100644 analyzers/calc.l create mode 100644 analyzers/calc.y create mode 100644 main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb36c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe \ No newline at end of file diff --git a/analyzers/calc.l b/analyzers/calc.l new file mode 100644 index 0000000..3ccaccb --- /dev/null +++ b/analyzers/calc.l @@ -0,0 +1,12 @@ +%{ +#include "calc.tab.h" // Автоматически создаётся Bison +%} + +%% +[0-9]+ { yylval = atoi(yytext); return NUMBER; } +[-+*/()] { return yytext[0]; } +[ \t\n] ; // Игнорируем пробелы и переносы +. { printf("unknown: %s\n", yytext); } +%% + +int yywrap() { return 1; } \ No newline at end of file diff --git a/analyzers/calc.y b/analyzers/calc.y new file mode 100644 index 0000000..fe710d0 --- /dev/null +++ b/analyzers/calc.y @@ -0,0 +1,33 @@ +%{ +#include +#include +void yyerror(const char *s); +int yylex(); +%} + +%token NUMBER +%left '+' '-' +%left '*' '/' + +%% +input: /* пусто */ + | input expr { printf("= %d\n", $2); } + ; + +expr: NUMBER { $$ = $1; } + | expr '+' expr { $$ = $1 + $3; } + | expr '-' expr { $$ = $1 - $3; } + | expr '*' expr { $$ = $1 * $3; } + | expr '/' expr { $$ = $1 / $3; } + | '(' expr ')' { $$ = $2; } + ; +%% + +void yyerror(const char *s) { + fprintf(stderr, "ERROR: %s\n", s); +} + +int main() { + yyparse(); + return 0; +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..7679eff --- /dev/null +++ b/main.py @@ -0,0 +1,37 @@ +import os +import subprocess + +def main(): + + # Подготовка констант + FLEX_EXE_PATH = r"C:\tools\win_flex_bison\win_flex.exe" + BISON_EXE_PATH = r"C:\tools\win_flex_bison\win_bison.exe" + ANALYZER_NAME = f'calc' # basename .l, .y файлов + LEXICAL_ANALYZER_PATH = fr"analyzers\{ANALYZER_NAME}.l" + SYNTAXIC_ANALYZER_PATH = fr"analyzers\{ANALYZER_NAME}.y" + # + + # Подготовка списка команд + cmds = [f'{FLEX_EXE_PATH} {LEXICAL_ANALYZER_PATH}', + f'{BISON_EXE_PATH} -d {SYNTAXIC_ANALYZER_PATH}', + f'gcc lex.yy.c {ANALYZER_NAME}.tab.c -o {ANALYZER_NAME}.exe'] + # + + # Исполнение команд + for cmd in cmds: + try: + subprocess.run(cmd, capture_output=True, check=True) + print(f'\033[92mSuccess execute {cmd}!\033[0m') + except subprocess.CalledProcessError as e: + print(f"\033[91mError during export: {e}\033[0m") + # + + # Очистка + for path in ['lex.yy.c', + f'{ANALYZER_NAME}.tab.c', + f'{ANALYZER_NAME}.tab.h']: + os.remove(path) + # + +if __name__ == "__main__": + main() \ No newline at end of file