2012-09-22 4 views
0

를 해결하는 방법을 나는 다음 (플렉스/들소)를 준 플렉스에서큰 프로그램에서 2 + 2, 2 + 2 충돌

:

pn [\+|\-] 
dig [0-9]+ 
exp [e|E]{dig}+ 

.

.

. 들소에서

"+"    {printf("+ detected\n"); 
       return PLUS_SIGN;} 




{pn}?{dig}+   { printf("digit detected - %s\n",yytext); 
       sscanf(yytext, "%d", (int*)&yylval); 
       return TYPE_INT;} 

:

expr: 
    expr PLUS_SIGN expr 
     { 
     $$ = $1 + $3; 
     printf(" $$=%f\n",$$); 
     } 
    | TYPE_INT 
     {  
     $$ = (int)$1; 
     printf(" $$=%f\n",$$); 
     } 
; 

문제는 :

나는 2 + 2가, 2 +2 대신 2의 인식 + 줄 때 2

어떻게 나는 그걸 추가로 할 수 있니?

+0

몇 실행 후 다목적 문장 부호/연산자의 모호성 문제 나는 재귀 적으로 w/o (f) lex/bison/yacc를 사용했다. –

답변

5
{pn}?{dig}+ 

숫자 토큰의 더하기 또는 빼기 부호 ({pn?})를 사용하지 마십시오. 그들을 두 개의 분리 된 토큰, 즉 +2으로 간주하십시오. 그러면 flex는 해결할 모호함이 없습니다.

{dig}+ 

대신 bison에 단항 플러스 및 마이너스 연산자를 처리하도록하십시오. 구문 분석기의 작업이 아니라 렉서스의 작업이되도록하십시오. 새로운 문법 이하 정도로 symbol.The PLUS_SIGN가 조합 남아 환원시

| PLUS_SIGN expr 
    { 
    $$ = +$2; 
    printf(" $$=%f\n",$$); 
    } 
| MINUS_SIGN expr 
    { 
    $$ = -$2; 
    printf(" $$=%f\n",$$); 
    } 
1

문법 좌측 부분을 도시 PLUS_SIGN의 오른쪽 부분은 동일한 우선 순위를 갖는다 :

expr: expr PLUS_SIGN expr2 
     { 
     $$ = $1 + $3; 
     printf("$$=%f\n", $$); 
     } 
    | expr2 
    { 
     $$ = $1; 
    } 
; 
expr2: TYPE_INT 
    {  
     $$ = (int)$1; 
     printf(" $$=%f\n",$$); 
    } 
;