calc test
commit
f3023ba5f4
|
@ -0,0 +1 @@
|
||||||
|
*.exe
|
|
@ -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; }
|
|
@ -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;
|
||||||
|
}
|
|
@ -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()
|
Loading…
Reference in New Issue