evaluate method
- SymbolTable table
override
Evaluates this AST node and generates corresponding LLVM IR code.
This is the main method that each AST node must implement to:
- Perform semantic analysis (type checking, symbol resolution)
- Generate LLVM IR instructions for the node's operation
- Return the result value (if this is an expression)
Parameters:
table
: The current symbol table for variable and function lookups
Returns: The result of evaluating this node (type depends on node type)
Throws:
- Exception for semantic errors (undefined variables, type mismatches, etc.)
- Various specific exceptions for different error conditions
Note: The base implementation throws "Not implemented" - concrete subclasses must override this method with their specific evaluation logic.
Implementation
@override
LangVal evaluate(SymbolTable table) {
final childResult = child.evaluate(table);
if (childResult.type.primitiveType == nodeValue.primitiveType) {
return childResult;
}
if (childResult.type.primitiveType == PrimitiveTypes.int &&
nodeValue.primitiveType == PrimitiveTypes.float) {
Node.addIrLine(
"%conv.$id = sitofp i64 ${childResult.regName} to double");
return LangVal("%conv.$id", const PrimitiveType(PrimitiveTypes.float));
} else if (childResult.type.primitiveType == PrimitiveTypes.float &&
nodeValue.primitiveType == PrimitiveTypes.int) {
Node.addIrLine(
"%conv.$id = fptosi double ${childResult.regName} to i64");
return LangVal("%conv.$id", const PrimitiveType(PrimitiveTypes.int));
}
throw Exception("Invalid type cast");
}