2016-12-05 63 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