The third project involves writing the semantic analyzer for the compiler that was begun in the previous projects. To simplify the semantic error checking, you are to remove the ability to have multiple functions from the grammar and the ability to make function calls.
In order to perform semantic analysis, the symbol table must be completed in this project. The 70 points that you will receive for the functionality portion of your grade on this project will be based on how many of the following errors that you can detect:
Using Boolean Expression with Arithmetic Operator |
5 points |
Using Boolean Expression with Relational Operator |
5 points |
Using Arithmetic Expression with Logical Operator |
10 points |
Conditional Expression Type Mismatch |
5 points |
If Condition Not Boolean |
5 points |
Narrowing Variable Initialization |
5 points |
Variable Initialization Mismatch |
5 points |
Undeclared Variable |
10 points |
Duplicate Variable |
10 points |
Narrowing Function Return |
10 points |
Test data that contains each of the following errors will be provided.
This project requires modification to the bison input file, so that it defines the semantic checks necessary to produce these errors and the inclusion of a symbol table to keep track of the declared identifiers.
Variables and parameter names have local scope. The scope rules require that all names be declared and prohibit duplicate names within the same scope. The type correspondence rules are as follows:
- Boolean operators cannot be used with arithmetic or relational operators.
- Arithmetic expressions cannot be used with logical operators.
- The two expressions in a conditional expression must match in type. No coercion is performed.
- The type of the if condition must be Boolean.
- A narrowing variable initialization or function return occurs when a real value is being forced into integer. Widening is permitted.
- Boolean types cannot be mixed with numeric types in variable initializations or function returns.
- Type coercion from an integer to a real type is performed within arithmetic expressions.
Like syntax errors, the compiler should display the semantic errors in the compilation listing, after the line in which they occur.