2013-02-28 2 views
1

플렉스와 들소를 사용하여 true nor true nor (false nor false)과 같은 표현식이없는 계산기를 구현하려고하지만 오류 메시지가 계속해서 나타납니다.플렉스 및 들소 계산기

%{ 
#include <stdlib.h> 
#include "y.tab.h" 
%} 

%% 
("true"|"false") {return BOOLEAN;} 

.|\n {yyerror();} 

%% 

int main(void) 
{ 
    yyparse(); 
    return 0; 
} 

int yywrap(void) 
{ 
    return 0; 
} 
int yyerror(void) 
{ 
    printf("Error\n"); 
} 

여기 내 .Y 파일입니다 : 여기 내 .L 파일입니다

/* Bison declarations. */ 
%token BOOLEAN 
%left 'nor' 

%% /* The grammar follows. */ 
input: 
    /* empty */ 
| input line 
; 

line: 
    '\n' 
| exp '\n' { printf ("%s",$1); } 
; 

exp: 
    BOOLEAN   { $$ = $1;   } 
| exp 'nor' exp  { $$ = !($1 || $3); } 
| '(' exp ')'  { $$ = $2;   } 
; 
%% 

사람이 문제를 볼 수 있습니까는?

답변

1

모든 단일 문자 토큰을 처리하는 간단한 방법은 @vitaut가 전혀 처리하지 않는다고 올바르게 말하면서 도트 규칙에 yytext[0]을 반환하고 구문 분석기가 어느 것이 합법인지 결정합니다 .

또한 BOOLEAN의 값을 잃어 버렸습니다. 'true'와 'false'는 각각 yylval에 1과 0으로 저장해야합니다. 그러면 $1,$3 등으로 나타납니다. 장기적으로 더 많은 데이터 유형을 사용하려면 %union 지시문을 조사해야합니다.

1

오류가 발생하는 이유는 렉서가 한 유형의 토큰, 즉 개행, 괄호 또는 nor이 아닌 다른 유형의 토큰 만 인식한다는 것입니다. 그리고 다른 모든 경우에는 오류가 발생합니다. 단일 문자의 경우 괄호처럼 토큰과 줄 바꿈 당신은 토큰 유형으로 문자 자체를 반환 할 수 있습니다 nor를 들어

\n { return '\n'; } 

당신이 BOOLEAN에 대한처럼 토큰 유형을 도입하고, 렉서에 적절한 규칙을 추가해야한다고 생각.