c65gm/internal/compiler/context.go

63 lines
1.9 KiB
Go

package compiler
import (
"c65gm/internal/preproc"
)
// CompilerContext holds all shared resources needed by commands during compilation
type CompilerContext struct {
// Symbol table for variables and constants
SymbolTable *SymbolTable
// Function handler for FUNC/CALL/FEND commands
FunctionHandler *FunctionHandler
// Constant string handler
ConstStrHandler *ConstantStringHandler
// Label stacks for control flow
LoopStartStack *LabelStack // Start of loop (like WHILE)
LoopEndStack *LabelStack // WHILE...WEND
IfStack *LabelStack // IF...ENDIF
GeneralStack *LabelStack // General purpose (GOSUB, etc)
ForStack *ForStack // For loop stack
SwitchStack *SwitchStack // Switch/case stack
CaseSkipStack *LabelStack // SWITCH/CASE skip labels
// Pragma access for per-line pragma lookup
Pragma *preproc.Pragma
}
// NewCompilerContext creates a new compiler context with initialized resources
func NewCompilerContext(pragma *preproc.Pragma) *CompilerContext {
symTable := NewSymbolTable()
constStrHandler := NewConstantStringHandler()
generalStack := NewLabelStack("_L")
ctx := &CompilerContext{
SymbolTable: symTable,
ConstStrHandler: constStrHandler,
LoopStartStack: NewLabelStack("_LOOPSTART"),
LoopEndStack: NewLabelStack("_LOOPEND"),
IfStack: NewLabelStack("_I"),
GeneralStack: generalStack,
ForStack: NewForStack(),
SwitchStack: NewSwitchStack(),
CaseSkipStack: NewLabelStack("_SKIPCASE"),
Pragma: pragma,
}
// FunctionHandler needs references to other components
ctx.FunctionHandler = NewFunctionHandler(symTable, generalStack, constStrHandler, pragma)
return ctx
}
// CurrentScope returns the current function scope(s) for symbol resolution
func (ctx *CompilerContext) CurrentScope() []string {
funcName := ctx.FunctionHandler.CurrentFunction()
if funcName == "" {
return nil
}
return []string{funcName}
}