이 Bison 프로그램에 문제가 있습니다. 재사용이 효과가없는 이유를 모르겠습니다. 음수로 작업하려면 첫 번째 숫자를 얻고 더 많은 연산을 수행하기 위해 같은 줄을 사용하면됩니다. 방금 첫 번째 숫자를 음수로 변경했습니다.비손과 플렉스로 계산이 작동하지 않습니다. 부정확합니다.
calc.y
%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
extern int yyparse();
extern FILE* yyin;
void yyerror(const char* s);
%}
%union {
int ival;
float fval;
}
%token<ival> T_INT
%token<fval> T_FLOAT
%token T_PLUS T_MINUS T_MULTIPLY T_DIVIDE T_LEFT T_RIGHT
%token T_NEWLINE T_QUIT
%left T_PLUS T_MINUS
%left T_MULTIPLY T_DIVIDE
%type<ival> expression
%type<fval> mixed_expression
%start calculation
%%
calculation:
| calculation line
;
line: T_NEWLINE
| mixed_expression T_NEWLINE { printf("\tResult: %f\n", $1);}
| expression T_NEWLINE { printf("\tResult: %i\n", $1); }
| T_QUIT T_NEWLINE { printf("bye!\n"); exit(0); }
;
mixed_expression: T_FLOAT { $$ = $1; }
| T_MINUS T_FLOAT { $$ = -$2; }
| mixed_expression T_PLUS mixed_expression { $$ = $1 + $3; }
| mixed_expression T_MINUS mixed_expression { $$ = $1 - $3; }
| mixed_expression T_MULTIPLY mixed_expression { $$ = $1 * $3; }
| mixed_expression T_DIVIDE mixed_expression { $$ = $1/$3; }
| T_LEFT mixed_expression T_RIGHT { $$ = $2; }
| T_MINUS mixed_expression T_RIGHT { $$ = -$2; }
| expression T_PLUS mixed_expression { $$ = $1 + $3; }
| expression T_MINUS mixed_expression { $$ = $1 - $3; }
| expression T_MULTIPLY mixed_expression { $$ = $1 * $3; }
| expression T_DIVIDE mixed_expression { $$ = $1/$3; }
| mixed_expression T_PLUS expression { $$ = $1 + $3; }
| mixed_expression T_MINUS expression { $$ = $1 - $3; }
| mixed_expression T_MULTIPLY expression { $$ = $1 * $3; }
| mixed_expression T_DIVIDE expression { $$ = $1/$3; }
| expression T_DIVIDE expression { $$ = $1/(float)$3; }
;
expression: T_INT { $$ = $1; }
| expression T_PLUS expression { $$ = $1 + $3; }
| expression T_MINUS expression { $$ = $1 - $3; }
| expression T_MULTIPLY expression { $$ = $1 * $3; }
| T_LEFT expression T_RIGHT { $$ = $2; }
| T_MINUS T_INT { $$ = -$2; }
;
%%
int main() {
yyin = stdin;
do {
yyparse();
} while(!feof(yyin));
return 0;
}
void yyerror(const char* s) {
fprintf(stderr, "Parse error: %s\n", s);
exit(1);
}
calclex.l
%option noyywrap
%{
#include <stdio.h>
#define YY_DECL int yylex()
#include "calc.tab.h"
%}
%%
[ \t] ; // ignore all whitespace
[0-9]+\.[0-9]+ {yylval.fval = atof(yytext); return T_FLOAT;}
[0-9]+ {yylval.ival = atoi(yytext); return T_INT;}
\n {return T_NEWLINE;}
"+" {return T_PLUS;}
"-" {return T_MINUS;}
"*" {return T_MULTIPLY;}
"/" {return T_DIVIDE;}
"(" {return T_LEFT;}
")" {return T_RIGHT;}
"exit" {return T_QUIT;}
"quit" {return T_QUIT;}
%%
이 문제의 원인을 "단항 마이너스"라고합니다. 예를 들어, http://www.gnu.org/software/bison/manual/html_node/Infix-Calc.html에서 Bison의 훌륭한 설명서를 간단히 들었을 수 있습니다. 그러나 누가 설명서를 읽었습니까? – deamentiaemundi
uhmmm 잘 시도해 보겠습니다. 나는이 환경에서 새로운 것입니다. 그런데 어떻게 작동하는지 정말 잘 모릅니다. 하지만 고마워, 최선을 다하겠습니다. –
단항 마이너스가 올바른 연관성이 있어야합니다. – user3344003