저는 컴파일러와 프로그래밍 언어가 어떻게 만들어 졌는지 이해하려고합니다. 그리고 그렇게하기 위해서 나는 덧셈과 뺄셈을하는 간단한 계산기를 만드는 것에 대해 생각했습니다. 아래는 Lex과 Yacc 파일입니다.간단한 Lex/Yacc 계산기 출력을 출력하지 않습니다.
calc.yacc 파일 :
%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
void yyerror(char *);
%}
%union { int number; }
%start line
%token <number> NUM
%type <number> expression
%%
line: expression { printf("%d\n", $1); };
expression: expression '+' NUM { $$ = $1 + $3; };
expression: expression '-' NUM { $$ = $1 - $3; };
expression: NUM { $$ = $1; };
%%
void yyerror(char *s) {
fprintf(stderr, "%s", s);
exit(1);
}
int main() {
yyparse();
return 0;
}
calc.lex 파일 :
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
%}
%%
[0-9]+ {
yylval.number = atoi(yytext);
return NUM;
}
[-+] { return yytext[0]; }
[ \t\f\v\n] { ; }
%%
int yywrap() {
return 1;
}
그것은 컴파일 잘하지만 난 그것을 실행 한 다음이 걸리면 2 + 4
뭔가를 입력 할 때와 대답을 인쇄하지 않습니다. 왜 누군가가 설명 할 수 있습니까? 제 추측으로는 문법이 정확하지 않다는 것입니다.
운영 체제의 터미널에서 ctrl/d 또는 ctrl/z 중 하나를 입력하면 출력이 인쇄됩니까? – EJP
'ctrl + d'에 답을 인쇄합니다. 하지만 인쇄가 끝나면 'Ctrl + d'키를 누르 자마자 프로그램에서 빠져 나옵니다. 나는 대답을 인쇄 한 후에 더 많은 인풋을 원한다. 어떻게해야합니까? –
계산기가 개행에 응답하게하려면 개행을 문법에 통합해야합니다. Iirc 거기 들소 설명서의 예입니다. – rici