Prev:

Explanation of `expr' ..................... The `exp' grouping has several rules, one for each kind of expression. The first rule handles the simplest expressions: those that are just numbers. The second handles an addition-expression, which looks like two expressions followed by a plus-sign. The third handles subtraction, and so on. exp: NUM | exp exp '+' { $$ = $1 + $2; } | exp exp '-' { $$ = $1 - $2; } ... ; We have used `|' to join all the rules for `exp', but we could equally well have written them separately: exp: NUM ; exp: exp exp '+' { $$ = $1 + $2; } ; exp: exp exp '-' { $$ = $1 - $2; } ; ... Most of the rules have actions that compute the value of the expression in terms of the value of its parts. For example, in the rule for addition, `$1' refers to the first component `exp' and `$2' refers to the second one. The third component, `'+'', has no meaningful associated semantic value, but if it had one you could refer to it as `$3'. When `yyparse' recognizes a sum expression using this rule, the sum of the two subexpressions' values is produced as the value of the entire expression.Note:Actions. You don't have to give an action for every rule. When a rule has no action, Bison by default copies the value of `$1' into `$$'. This is what happens in the first rule (the one that uses `NUM'). The formatting shown here is the recommended convention, but Bison does not require it. You can add or change whitespace as much as you wish. For example, this: exp : NUM | exp exp '+' {$$ = $1 + $2; } | ... means the same thing as this: exp: NUM | exp exp '+' { $$ = $1 + $2; } | ... The latter, however, is much more readable.