野牛中的运算符优先级

operator precedence in bison

我有一个 flex-bison 项目,其中我需要支持一些字符串运算符,运算符 '^' 表示反转字符串,运算符 [i] 表示 return 字符串中的索引 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(,,,temp);
                  }
| '^' substring   {   //BUT I WANT THIS (REVERSING) TO BE FIRST    
                  $$ = reverseStrings(,temp);
                  }
;

如何更改该优先级?我不太了解优先规则,在多个 (*) 之前使用加号 (+) 非常容易,但是对于那些运算符我真的不知道如何使用它。 有什么帮助...?

您需要单独的作品,而不是同一作品中的交替作品,例如:

string
    : substring
    ;

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

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