0
我想了解編譯器和編程語言是如何製作的。爲了做到這一點,我想創建一個簡單的計算器,只是加法和減法。下面是我編寫的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,無論哪一個是EOF時,是否打印輸出? – EJP
它在'ctrl + d'上打印出答案。 但是現在打印完畢後,只要按下'ctrl + d'鍵就會退出程序。我希望在打印出答案後再輸入更多的信息。我怎樣才能做到這一點? –
如果你想讓你的計算器對換行符作出響應,你將需要在你的語法中加入換行符。 Iirc在野牛手冊中有一個例子。 – rici