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