2012-09-22 177 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}+ 

取而代之的是,野牛能夠處理一元加減運算符。把它作爲解析器的工作,而不是詞法分析器的工作。

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

語法顯示左部和PLUS_SIGN的右側部分具有相同的優先級降低symbol.The PLUS_SIGN留下組合,所以新的語法低於當:

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