2016-12-05 93 views
0

我有一個flex-bison項目,我需要支持一些字符串運算符,而運算符'^'表示反轉字符串,而運算符[i]表示在字符串中返回索引i。 正確的輸入和輸出,例如:運算符優先於野牛

input : ^"abc"[0]  ---> correct output: "c", my output: "a" 

這是因爲第一欲逆轉它(「CBA」),然後取0的索引(「CBA」 [0]爲c)。 現在,我不知道如何做這個優先級,所以我的代碼輸出「a」,因爲它首先需要「abc」[0] - >「a」,然後反轉它 - >「a」。截至目前我在我的野牛檔案:

%left STR MINI 
%left '^'   
substring: 

STR MINI   { //THIS IS DONE FIRST, SUBSTRING  
        $$ = substringFind($1,$2,$2,temp); 
        } 
| '^' substring { //BUT I WANT THIS (REVERSING) TO BE FIRST  
        $$ = reverseStrings($2,temp); 
        } 
; 

我該如何改變這種優先順序?我並不十分了解優先規則,在多個(*)之前用plus(+)很容易,但對於那些運營商而言,我真的不知道如何使用它。 任何幫助...?

+0

你需要單獨製作,同樣的生產中沒有交替。什麼是MINI? – EJP

+0

MINI是索引,在「abc」中說[0]我把mini看作是0.我不明白如何分開這個2 – mooly

+0

@EJP:你可以寫'substring:STR |子串MINI | '^'子串'以及優先聲明。優先權聲明在OP中不起作用,因爲不存在解決衝突。 (雖然我更喜歡沒有優先聲明的版本)。+ – rici

回答

1

你需要單獨製作,同樣的生產中不候補委員,這樣的:

string 
    : substring 
    ; 

substring 
    : reverse MINI { ... } 
    | reverse 
    ; 

reverse 
    : "^" reverse { ... } 
    | STR 
    ; 
+0

我還是不明白,你的「反向」只能得到STR,但是在這裏我有STR MINI,所以我怎麼會抓住它呢?什麼時候「反向」變成STR? – mooly

+1

通過子字符串:反向MINI和反向STR。 – EJP