Semantic Analysis: Difference between revisions
From Wiki**3
No edit summary |
|||
Line 14: | Line 14: | ||
The visitor approach to type checking is justified by the independence of code generation from the details of type checking. In addition, the same type validator may be shared by several visitors performing code generation. In our example, the only changes to the original Compact are located in <tt>Cwriter.cpp</tt> (in each node we wish to check). The validation code is self-contained and is integrated as the drop-in class TypeValidator (<tt>TypeValidator.h</tt> and <tt>TypeValidator.cpp</tt>). | The visitor approach to type checking is justified by the independence of code generation from the details of type checking. In addition, the same type validator may be shared by several visitors performing code generation. In our example, the only changes to the original Compact are located in <tt>Cwriter.cpp</tt> (in each node we wish to check). The validation code is self-contained and is integrated as the drop-in class TypeValidator (<tt>TypeValidator.h</tt> and <tt>TypeValidator.cpp</tt>). | ||
Example 1 from Compact: the original Compact compiler would accept the code, but the new one does not: since '''x''' is an integer and conditions must be boolean, it is rejected as a condition for '''if'''. | |||
<text> | |||
program | |||
x = 0; | |||
if (x) print x; | |||
while (x < 30) { | |||
print x; | |||
x = x + 1; | |||
} | |||
end | |||
</text> | |||
== Simple Type Checking Example == | == Simple Type Checking Example == |
Revision as of 19:38, 11 May 2008
- Abstract syntax tree; nodes
- Symbols and types
- Symbol table
- Varible and function declarations
- Type checking
Type Checking Example: Compact
The package provided here contains the Compact compiler.
This version has been improved to perform type checking in the C generator visitor. This visitor uses a second visitor to check types before deciding on which code to generate. The checks are related with the use of boolean expressions in tests (while, if, and if-else nodes) and with type consistency in operators (in this case, although we could have decided otherwise, operators such as + and - must have arguments of the same type and this type must be integer). In addition, the compiler now checks if a variable has the proper type in certain cases (for instance, in the tests mentioned above).
The visitor approach to type checking is justified by the independence of code generation from the details of type checking. In addition, the same type validator may be shared by several visitors performing code generation. In our example, the only changes to the original Compact are located in Cwriter.cpp (in each node we wish to check). The validation code is self-contained and is integrated as the drop-in class TypeValidator (TypeValidator.h and TypeValidator.cpp).
Example 1 from Compact: the original Compact compiler would accept the code, but the new one does not: since x is an integer and conditions must be boolean, it is rejected as a condition for if. <text> program x = 0; if (x) print x; while (x < 30) {
print x; x = x + 1;
} end </text>
Simple Type Checking Example
The following example considers a simple grammar and performs the whole of the semantic analysis process and, finally, generates the corresponding C code. The semantic analysis process must account for variables (they must be declared before they can be used) and for their types (all types must be used correctly).