evaluate method

  1. @override
LangVal<LangType> evaluate(
  1. 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:

  1. Perform semantic analysis (type checking, symbol resolution)
  2. Generate LLVM IR instructions for the node's operation
  3. 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");
}