私はコンパイラとプログラミング言語の作り方を理解しようとしています。そして、そうするために、私は単なる加算と減算を行う単純な電卓を作成することを考えました。以下は、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にはbisonマニュアルの例があります。 – rici