The epsilon represents nothing. In other words a regular expression like ab?c could be accpeted by a grammar like:
In any case, I have found the problem, and it was in "pattern." The problem was that Bison could not determine if it should choose the first or second production because pattern_qual_id could evaluate to epsilon which would then make both productions begin with atomic_patt. So instead of using the epsilon, I just split the two options into two productions.
S -> aTc
T -> b | epsilon
The correction of pattern looks like this (and pattern_qual_id is now gone):
pattern : atomic_patt pattern_type
| qual_id atomic_patt pattern_type
| atomic_patt CONS_TK atomic_patt