An action can refer to values returned by actions to the left of the current rule. The mechanism is the same as ordinary actions, $ followed by a digit.
sent : adj noun verb adj noun { look at the sentence ... } ; adj : THE { $$ = THE; } | YOUNG { $$ = YOUNG; } ... ; noun : DOG { $$ = DOG; } | CRONE { if ( $0 = = YOUNG ) { (void) printf( "what?\n" ); } $$ = CRONE; } ; ...
In this case, the digit can be 0 or negative. In the action following the word CRONE, a check is made that the preceding token shifted was not YOUNG. Notice, however, that this is only possible when a great deal is known about what might precede the symbol noun in the input. Nevertheless, at times this mechanism prevents a great deal of trouble, especially when a few combinations are to be excluded from an otherwise regular structure.