私は本を読んでいます—「フレックスとバイソン」パーサジェネレータがどのように機能するかを理解するために、例があります:
calclist: /* nothing */
| calclist exp EOL { printf("= %d\n", $1); }
;
exp: factor
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor: term
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1 / $3; }
;
term: NUMBER
| ABS term { $$ = $2 >= 0? $2 : - $2; }
;
また、本では、上記の文法は、個別の非終端記号を使用することにより、暗黙的に優先されると述べています。しかし、それはどのように機能しますか?次の例があると仮定します:(1 + 3 * 2
空白はスキップするだけです)最初のトークンを読み取り、それが文法を「バブリング」する時間と同じか、それとも1
スタックにプッシュされますか?次のトークンはどの文法規則からチェックされますか?なぜこの文法では、乗算が加算よりも優先されるのですか?NUMBER
term
factor