Používam jison (javascriptový ekvivalent Bison) a mám nasledujúci problém s prioritou. Ilustrujem to pomocou ukážky kalkulačky http://zaach.github.com/jison/try/
Funguje to dobre. Prednosť je
%left "+" "-"
%left "*" "/"
%left "^"
%left UMINUS
a gramatika je
e
: e "+" e
{$$ = $1+$3;}
| e "-" e
{$$ = $1-$3;}
| e "*" e
{$$ = $1*$3;}
| e "/" e
{$$ = $1/$3;}
| e "^" e
{$$ = Math.pow($1, $3);}
| "-" e %prec UMINUS
{$$ = -$2;}
Ak zmením riadok „*“ na
| e "*" e %prec TIMESPREC
{$$ = $1*$3;}
a zmeniť prioritu na
%left "+" "-"
%left TIMESPREC "/"
%left "^"
%left UMINUS
už to nefunguje. Nemá to fungovať rovnako? To by mohlo byť užitočné, napríklad, ak by niekto chcel mať nakoniec algebraickú syntax, kde 2 x + 3 sa analyzujú ako (2x) +3.
Vďaka!
odpovede:
2 pre odpoveď č. 1Dôvodom je to preto, že %prec
nastaví iba prioritu pravidla, nie všetky jednotlivé tokeny. Takže stále zostáva dôležitá individuálna priorita žetónov v predpise RHS.
Takže nastavenie %prec
na vašom multiplikačnom pravidle nezmení prioritu "*"
symbol. Keď sa priorita pokúsi vyriešiť konflikty, porovná prioritu redukčných akcií s prioritou tokenu, ktorý sa má posunúť. od tej doby *
nemá prioritu, gramatika sa stane s vašou zmenou dvojznačnou.