あなたは、特定の実際的な問題を解決しようとしているのではないと言います。そして、あなたの質問から、優先順位マーカーをどのように使用しようとしているのかについて少し混乱しています。
優先順位マーカーを頻繁に使用する必要がないことがわかると思います。優先順位が明示的に考慮されるように文法を書き直す方が、通常はより単純で、読者にとってより明確です。乗算と除算を足し算と引き算よりも優先するには、次のようにします (John Levine、lex & yacc 2/e、1992 からの例)。
%token NAME NUMBER
%%
stmt : NAME '=' expr
| expr
;
expr : expr '+' term
| expr '-' term
| term
;
term : term '*' factor
| term '/' factor
| factor
;
factor : '(' expr ')'
| '-' factor
| NUMBER
;
あなたの例では、実際のトークンではありませんPLUS
。および とMULTIPLY
同じ意味で使用することはできません。Levine はそれらを疑似トークンと呼んでいます。それらは、プロダクションを、および宣言で定義した優先順位のリストにリンクするためにあります。彼は、「-」トークンの優先順位が低い場合でも、単項マイナスの優先順位を高くするために使用する方法の例を示しています。'+'
'*'
%left
%nonassoc
%prec
%token NAME NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS
%%
stmt : NAME '=' expr
| expr
;
expr : expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '-' expr %prec UMINUS
| '(' expr ')'
| NUMBER
;
要約すると、2 番目のコード例ではなく、最初のコード例のパターンに従うことをお勧めします。文法を明確にする。