+ /**
+ * Whether this node contains a symbol, a semantic type, a \c <*>, or a
+ * \c <>.
+ */
+ enum {
+ SYMLIST_SYMBOL,
+ SYMLIST_TYPE
+ } content_type;
+ union {
+ /**
+ * The symbol or \c NULL iff
+ * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
+ */
+ symbol *sym;
+ /**
+ * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
+ */
+ semantic_type *sem_type;
+ } content;
+ location location;
+
+ /* Named reference. */
+ named_ref *named_ref;
+
+ /* Proper location of the symbol, not all the rule */
+ location sym_loc;
+
+ /* If this symbol is the generated lhs for a midrule but this is the rule in
+ whose rhs it appears, MIDRULE = a pointer to that midrule. */
+ struct symbol_list *midrule;
+
+ /* If this symbol is the generated lhs for a midrule and this is that
+ midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
+ appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
+ parent rule. */
+ struct symbol_list *midrule_parent_rule;
+ int midrule_parent_rhs_index;
+
+ /* ---------------------------------------------- */
+ /* Apply to the rule (attached to the LHS only). */
+ /* ---------------------------------------------- */
+
+ /* Precedence/associativity. */
+ symbol *ruleprec;
+
+ /* The action is attached to the LHS of a rule, but action properties for
+ * each RHS are also stored here. */
+ code_props action_props;
+
+ /* The location of the first %empty for this rule, or \a
+ empty_location. */
+ location percent_empty_loc;