/ / bison precedens (v skutočnosti používa jison, ale malo by byť rovnaké) - javascript, bison, jison

bizónová prednosť (v skutočnosti používa jizón, ale mala by byť rovnaká) - javascript, bison, jison

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ď č. 1

Dô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.