calc test

master
serr 2025-03-30 17:51:29 +03:00
commit f3023ba5f4
4 changed files with 83 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.exe

12
analyzers/calc.l Normal file
View File

@ -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; }

33
analyzers/calc.y Normal file
View File

@ -0,0 +1,33 @@
%{
#include <stdio.h>
#include <stdlib.h>
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;
}

37
main.py Normal file
View File

@ -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()