Generating code for expressions
The easiest code to generate is straight-line code consisting of statements and expressions that execute in sequence with no control flow. As described earlier in this chapter, there are two attributes to compute for each node: the attribute for where to find an expression’s value is called addr
, while the intermediate code necessary to compute its value is called icode
.
The values to be computed for these attributes for a subset of the Jzero expression grammar are shown in the following table. The |||
operator refers to list concatenation:
Figure 9.4: Semantic rules for expressions
The main intermediate code generation algorithm is a post-order traversal of the syntax tree. To present it in small chunks, the traversal is broken into the main method, gencode()
, and helper methods for each non-terminal. In Unicon, the gencode()
method in tree.icn
looks as follows:
method gencode()
every (!\kids).gencode()
case sym of...