Next: , Previous: , Up: Java Parsers   [Contents][Index]

10.3.2 Java Semantic Values

There is no %union directive in Java parsers. Instead, the semantic values’ types (class names) should be specified in the %nterm or %token directive:

%nterm <Expression> expr assignment_expr term factor
%nterm <Integer> number

By default, the semantic stack is declared to have Object members, which means that the class types you specify can be of any class. To improve the type safety of the parser, you can declare the common superclass of all the semantic values using the ‘%define api.value.type’ directive. For example, after the following declaration:

%define api.value.type {ASTNode}

any %token, %nterm or %type specifying a semantic type which is not a subclass of ASTNode, will cause a compile-time error.

Types used in the directives may be qualified with a package name. Primitive data types are accepted for Java version 1.5 or later. Note that in this case the autoboxing feature of Java 1.5 will be used. Generic types may not be used; this is due to a limitation in the implementation of Bison, and may change in future releases.

Java parsers do not support %destructor, since the language adopts garbage collection. The parser will try to hold references to semantic values for as little time as needed.

Java parsers do not support %printer, as toString() can be used to print the semantic values. This however may change (in a backwards-compatible way) in future versions of Bison.