2016-10-17 3 views
1

나는 bison flex를 사용하여 중온 계산기를 작성하는 예제를 테스트하고 있습니다. 나는 모든 것이 괄호 "()"를 제외하고 옳다는 것을 발견했다. 대괄호로 계산을 입력 할 때 계산 결과가 올바르지 않습니다. 여기에 파일 "중위 - calc.y"우선 순위와 연관성이있는 중급 계산기를 구현하는 방법

/* bison grammar file for infix notation calculator */ 
%{ 
#define YYSTYPE double 
#include <math.h> 
#include <stdio.h> 


int yyerror(const char *s); 
int yylex(void); 


%} 

%token NUM 
%left '-' '+' 
%left '*' '/' 
%left NEG 
%right '^' 

%% /* Grammer rules and actions follow */ 

input: /* empty */ 
    | input line 
    ; 

line: '\n' 
    | exp '\n' { printf("\t%.10g\n", $1); } 
    ; 

exp: NUM { $$ = $1; } 
    | exp '+' exp { $$ = $1 + $3; } 
    | exp '-' exp { $$ = $1 - $3; } 
    | exp '*' exp { $$ = $1 * $3; } 
    | exp '/' exp { $$ = $1/$3; } 
    | '-' exp %prec NEG { $$ = -$2; } 
    | exp '^' exp { $$ = pow($1, $3); } 
    | '(' exp ')' { $$ = $2; } 
    ; 

%% 

/* Additional C code */ 

int main() { return yyparse(); } 

int yyerror(const char* s) 
{ 
    printf("%s\n", s); 
    return 0; 
} 

을위한 코드입니다 그리고 여기

/* lex file for infix notation calculator */ 
%option noyywrap 

%{ 
#define YYSTYPE double  /* type for bison's var: yylval */ 
#include <stdlib.h>  /* for atof(const char*) */ 
#include "infix-calc.tab.h" 
%} 


digits [0-9] 
rn  (0|[1-9]+{digits}*)\.?{digits}* 
op  [+*^/\-] 
ws  [ \t]+ 


%% 

{rn} yylval = atof(yytext); return NUM; 
{op} | 
\n  return *yytext; 
{ws} /* eats up white spaces */ 

%% 

문제는 내가 입력 말할 때이다 파일 "중위-calc.lex"에 대한 코드입니다 "2 * (3 + 4)", 출력 "14"를 수신해야합니다. 그러나 입력은 "() 10"입니다. 이 경우 대괄호가 작동하지 않는 것 같습니다. 코드에 무슨 문제가 있습니까? 나를 도와 주셔서 대단히 감사합니다 !!!!

+0

yacc 규칙이 정상적으로 보입니다. 어쩌면 렉스? 각 규칙에서 printf 문을 사용하여 규칙 실행을 인쇄하십시오. –

답변

0

()을 작동시키기위한 토큰으로 선언해야하는 것처럼 보입니다.

당신 렉스 파일의 최종 %% 전에 다음 두 줄을 추가

"(" return LEFT; 
")" return RIGHT; 

그리고 중위 - calc.y의 상단에

%token LEFT RIGHT 

를 추가하고, 대체

| '(' exp ')' { $$ = $2; } 

| LEFT exp RIGHT { $$ = $2; } 
+0

고마워요! 그것은 작동합니다! – pfc

+0

일반 스타일은 인식 할 수없는 입력에 대해 단일 문자 토큰을 보내는 것이지만 단일 문자 토큰에 대한 규칙에 괄호를 추가하기 만하면됩니다. – rici

관련 문제