Documentation
¶
Index ¶
- func AsLocalVariable(identifier string) string
- func Generate(node ast.Node, logger logger.Logger) string
- type BlocksFragment
- func (blocksFragment *BlocksFragment) AddBlock(block *ir.Block)
- func (blocksFragment *BlocksFragment) Append(fragment Fragment)
- func (blocksFragment *BlocksFragment) AppendWithResultPropogation(fragment Fragment)
- func (blocksFragment *BlocksFragment) ChainBlocks(blocks ...*ir.Block)
- func (blocksFragment *BlocksFragment) GetResult() value.Value
- func (blocksFragment *BlocksFragment) GetResultType() ResultType
- func (blocksFragment *BlocksFragment) NewBlock(name string)
- type CodegenVisitor
- func (visitor *CodegenVisitor) Init(logger logger.Logger)
- func (visitor *CodegenVisitor) VisitBooleanNode(node *ast.BooleanNode)
- func (visitor *CodegenVisitor) VisitBreakNode(node *ast.BreakNode)
- func (visitor *CodegenVisitor) VisitCharacterNode(node *ast.CharacterNode)
- func (visitor *CodegenVisitor) VisitEnterAssignmentNode(node *ast.AssignmentNode)
- func (visitor *CodegenVisitor) VisitEnterBinaryOepratorNode(node *ast.BinaryOperatorNode)
- func (visitor *CodegenVisitor) VisitEnterBlockNode(node *ast.BlockNode)
- func (visitor *CodegenVisitor) VisitEnterForStmtNode(node *ast.ForStmtNode)
- func (visitor *CodegenVisitor) VisitEnterForStmtNodeBeforeBlockNode(node *ast.ForStmtNode)
- func (visitor *CodegenVisitor) VisitEnterIfStmtNode(node *ast.IfStmtNode)
- func (visitor *CodegenVisitor) VisitEnterIncDecNode(node *ast.IncDecNode)
- func (visitor *CodegenVisitor) VisitEnterPrintNode(node *ast.PrintNode)
- func (visitor *CodegenVisitor) VisitEnterProgramNode(node *ast.ProgramNode)
- func (visitor *CodegenVisitor) VisitEnterSwitchStmtNode(node *ast.SwitchStmtNode)
- func (visitor *CodegenVisitor) VisitEnterTernaryOperatorNode(node *ast.TernaryOperatorNode)
- func (visitor *CodegenVisitor) VisitEnterUnaryOperatorNode(node *ast.UnaryOperatorNode)
- func (visitor *CodegenVisitor) VisitEnterVariableDeclarationNode(node *ast.VariableDeclarationNode)
- func (visitor *CodegenVisitor) VisitEnterWhileStmtNode(node *ast.WhileStmtNode)
- func (visitor *CodegenVisitor) VisitErrorNode(node *ast.ErrorNode)
- func (visitor *CodegenVisitor) VisitFloatNode(node *ast.FloatNode)
- func (visitor *CodegenVisitor) VisitIdentifierNode(node *ast.IdentifierNode)
- func (visitor *CodegenVisitor) VisitIntegerNode(node *ast.IntegerNode)
- func (visitor *CodegenVisitor) VisitLeaveAssignmentNode(node *ast.AssignmentNode)
- func (visitor *CodegenVisitor) VisitLeaveBinaryOperatorNode(node *ast.BinaryOperatorNode)
- func (visitor *CodegenVisitor) VisitLeaveBlockNode(node *ast.BlockNode)
- func (visitor *CodegenVisitor) VisitLeaveForStmtNode(node *ast.ForStmtNode)
- func (visitor *CodegenVisitor) VisitLeaveIfStmtNode(node *ast.IfStmtNode)
- func (visitor *CodegenVisitor) VisitLeaveIncDecNode(node *ast.IncDecNode)
- func (visitor *CodegenVisitor) VisitLeavePrintNode(node *ast.PrintNode)
- func (visitor *CodegenVisitor) VisitLeaveProgramNode(node *ast.ProgramNode)
- func (visitor *CodegenVisitor) VisitLeaveSwitchStmtNode(node *ast.SwitchStmtNode)
- func (visitor *CodegenVisitor) VisitLeaveTernaryOperatorNode(node *ast.TernaryOperatorNode)
- func (visitor *CodegenVisitor) VisitLeaveUnaryOperatorNode(node *ast.UnaryOperatorNode)
- func (visitor *CodegenVisitor) VisitLeaveVariableDeclarationNode(node *ast.VariableDeclarationNode)
- func (visitor *CodegenVisitor) VisitLeaveWhileStmtNode(node *ast.WhileStmtNode)
- func (visitor *CodegenVisitor) VisitStringNode(node *ast.StringNode)
- func (visitor *CodegenVisitor) VisitTypeLiteralNode(node *ast.TypeLiteralNode)
- type Fragment
- type FragmentType
- type FunctionsFragment
- func (functionsFragment *FunctionsFragment) AddFunc(function *ir.Func)
- func (functionsFragment *FunctionsFragment) Append(fragment Fragment)
- func (functionsFragment *FunctionsFragment) AppendWithResultPropogation(fragment Fragment)
- func (functionsFragment *FunctionsFragment) GetResult() value.Value
- func (functionsFragment *FunctionsFragment) GetResultType() ResultType
- type GlobalIdentifierTracker
- type IdentifierTracker
- type Instruction
- type InstructionsFragment
- func (instructionsFragment *InstructionsFragment) AddInstruction(instr ir.Instruction)
- func (instructionsFragment *InstructionsFragment) Append(fragment Fragment)
- func (instructionsFragment *InstructionsFragment) AppendWithResultPropogation(fragment Fragment)
- func (instructionsFragment *InstructionsFragment) GetResult() value.Value
- func (instructionsFragment *InstructionsFragment) GetResultType() ResultType
- type IrLiner
- type Label
- type Labeller
- type LocalIdentifierTracker
- type ModuleFragment
- type OperatorCodegen
- type ResultType
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AsLocalVariable ¶
Types ¶
type BlocksFragment ¶
type BlocksFragment struct {
Blocks []*ir.Block
CurrentBlock *ir.Block
// contains filtered or unexported fields
}
func NewBlocksFragment ¶
func NewBlocksFragment(resultType ResultType) *BlocksFragment
func (*BlocksFragment) AddBlock ¶
func (blocksFragment *BlocksFragment) AddBlock(block *ir.Block)
func (*BlocksFragment) Append ¶
func (blocksFragment *BlocksFragment) Append(fragment Fragment)
func (*BlocksFragment) AppendWithResultPropogation ¶
func (blocksFragment *BlocksFragment) AppendWithResultPropogation(fragment Fragment)
func (*BlocksFragment) ChainBlocks ¶
func (blocksFragment *BlocksFragment) ChainBlocks(blocks ...*ir.Block)
func (*BlocksFragment) GetResult ¶
func (blocksFragment *BlocksFragment) GetResult() value.Value
func (*BlocksFragment) GetResultType ¶
func (blocksFragment *BlocksFragment) GetResultType() ResultType
func (*BlocksFragment) NewBlock ¶
func (blocksFragment *BlocksFragment) NewBlock(name string)
type CodegenVisitor ¶
type CodegenVisitor struct {
// contains filtered or unexported fields
}
CodegenVisitor visits each node and generates llvm IR.
func (*CodegenVisitor) Init ¶
func (visitor *CodegenVisitor) Init(logger logger.Logger)
Init with a logger
func (*CodegenVisitor) VisitBooleanNode ¶
func (visitor *CodegenVisitor) VisitBooleanNode(node *ast.BooleanNode)
VisitBooleanNode do something
func (*CodegenVisitor) VisitBreakNode ¶
func (visitor *CodegenVisitor) VisitBreakNode(node *ast.BreakNode)
func (*CodegenVisitor) VisitCharacterNode ¶
func (visitor *CodegenVisitor) VisitCharacterNode(node *ast.CharacterNode)
VisitCharacterNode do something
func (*CodegenVisitor) VisitEnterAssignmentNode ¶
func (visitor *CodegenVisitor) VisitEnterAssignmentNode(node *ast.AssignmentNode)
VisitEnterAssignmentNode do something
func (*CodegenVisitor) VisitEnterBinaryOepratorNode ¶
func (visitor *CodegenVisitor) VisitEnterBinaryOepratorNode(node *ast.BinaryOperatorNode)
VisitEnterBinaryOepratorNode do something
func (*CodegenVisitor) VisitEnterBlockNode ¶
func (visitor *CodegenVisitor) VisitEnterBlockNode(node *ast.BlockNode)
func (*CodegenVisitor) VisitEnterForStmtNode ¶
func (visitor *CodegenVisitor) VisitEnterForStmtNode(node *ast.ForStmtNode)
func (*CodegenVisitor) VisitEnterForStmtNodeBeforeBlockNode ¶
func (visitor *CodegenVisitor) VisitEnterForStmtNodeBeforeBlockNode(node *ast.ForStmtNode)
func (*CodegenVisitor) VisitEnterIfStmtNode ¶
func (visitor *CodegenVisitor) VisitEnterIfStmtNode(node *ast.IfStmtNode)
func (*CodegenVisitor) VisitEnterIncDecNode ¶
func (visitor *CodegenVisitor) VisitEnterIncDecNode(node *ast.IncDecNode)
func (*CodegenVisitor) VisitEnterPrintNode ¶
func (visitor *CodegenVisitor) VisitEnterPrintNode(node *ast.PrintNode)
VisitEnterPrintNode do something
func (*CodegenVisitor) VisitEnterProgramNode ¶
func (visitor *CodegenVisitor) VisitEnterProgramNode(node *ast.ProgramNode)
VisitEnterProgramNode creates program scope
func (*CodegenVisitor) VisitEnterSwitchStmtNode ¶
func (visitor *CodegenVisitor) VisitEnterSwitchStmtNode(node *ast.SwitchStmtNode)
func (*CodegenVisitor) VisitEnterTernaryOperatorNode ¶
func (visitor *CodegenVisitor) VisitEnterTernaryOperatorNode(node *ast.TernaryOperatorNode)
VisitEnterTernaryOperatorNode do something
func (*CodegenVisitor) VisitEnterUnaryOperatorNode ¶
func (visitor *CodegenVisitor) VisitEnterUnaryOperatorNode(node *ast.UnaryOperatorNode)
VisitEnterUnaryOperatorNode do something
func (*CodegenVisitor) VisitEnterVariableDeclarationNode ¶
func (visitor *CodegenVisitor) VisitEnterVariableDeclarationNode(node *ast.VariableDeclarationNode)
VisitEnterVariableDeclarationNode do something
func (*CodegenVisitor) VisitEnterWhileStmtNode ¶
func (visitor *CodegenVisitor) VisitEnterWhileStmtNode(node *ast.WhileStmtNode)
func (*CodegenVisitor) VisitErrorNode ¶
func (visitor *CodegenVisitor) VisitErrorNode(node *ast.ErrorNode)
VisitErrorNode should not happen during codegen
func (*CodegenVisitor) VisitFloatNode ¶
func (visitor *CodegenVisitor) VisitFloatNode(node *ast.FloatNode)
VisitFloatNode do something
func (*CodegenVisitor) VisitIdentifierNode ¶
func (visitor *CodegenVisitor) VisitIdentifierNode(node *ast.IdentifierNode)
VisitIdentifierNode do something
func (*CodegenVisitor) VisitIntegerNode ¶
func (visitor *CodegenVisitor) VisitIntegerNode(node *ast.IntegerNode)
VisitIntegerNode do something
func (*CodegenVisitor) VisitLeaveAssignmentNode ¶
func (visitor *CodegenVisitor) VisitLeaveAssignmentNode(node *ast.AssignmentNode)
VisitLeaveAssignmentNode do something
func (*CodegenVisitor) VisitLeaveBinaryOperatorNode ¶
func (visitor *CodegenVisitor) VisitLeaveBinaryOperatorNode(node *ast.BinaryOperatorNode)
VisitLeaveBinaryOperatorNode do something
func (*CodegenVisitor) VisitLeaveBlockNode ¶
func (visitor *CodegenVisitor) VisitLeaveBlockNode(node *ast.BlockNode)
func (*CodegenVisitor) VisitLeaveForStmtNode ¶
func (visitor *CodegenVisitor) VisitLeaveForStmtNode(node *ast.ForStmtNode)
func (*CodegenVisitor) VisitLeaveIfStmtNode ¶
func (visitor *CodegenVisitor) VisitLeaveIfStmtNode(node *ast.IfStmtNode)
func (*CodegenVisitor) VisitLeaveIncDecNode ¶
func (visitor *CodegenVisitor) VisitLeaveIncDecNode(node *ast.IncDecNode)
func (*CodegenVisitor) VisitLeavePrintNode ¶
func (visitor *CodegenVisitor) VisitLeavePrintNode(node *ast.PrintNode)
VisitLeavePrintNode do something
func (*CodegenVisitor) VisitLeaveProgramNode ¶
func (visitor *CodegenVisitor) VisitLeaveProgramNode(node *ast.ProgramNode)
VisitLeaveProgramNode closes program scope
func (*CodegenVisitor) VisitLeaveSwitchStmtNode ¶
func (visitor *CodegenVisitor) VisitLeaveSwitchStmtNode(node *ast.SwitchStmtNode)
func (*CodegenVisitor) VisitLeaveTernaryOperatorNode ¶
func (visitor *CodegenVisitor) VisitLeaveTernaryOperatorNode(node *ast.TernaryOperatorNode)
VisitLeaveTernaryOperatorNode do something
func (*CodegenVisitor) VisitLeaveUnaryOperatorNode ¶
func (visitor *CodegenVisitor) VisitLeaveUnaryOperatorNode(node *ast.UnaryOperatorNode)
VisitLeaveUnaryOperatorNode do something
func (*CodegenVisitor) VisitLeaveVariableDeclarationNode ¶
func (visitor *CodegenVisitor) VisitLeaveVariableDeclarationNode(node *ast.VariableDeclarationNode)
VisitLeaveVariableDeclarationNode do something
func (*CodegenVisitor) VisitLeaveWhileStmtNode ¶
func (visitor *CodegenVisitor) VisitLeaveWhileStmtNode(node *ast.WhileStmtNode)
func (*CodegenVisitor) VisitStringNode ¶
func (visitor *CodegenVisitor) VisitStringNode(node *ast.StringNode)
VisitStringNode do something
func (*CodegenVisitor) VisitTypeLiteralNode ¶
func (visitor *CodegenVisitor) VisitTypeLiteralNode(node *ast.TypeLiteralNode)
VisitTypeLiteralNode do something
type Fragment ¶
type Fragment interface {
Append(fragment Fragment)
AppendWithResultPropogation(fragment Fragment)
GetResultType() ResultType
GetResult() value.Value
}
Fragment represents a fragment of instructions in asm
type FragmentType ¶
type FragmentType int
const ( MODULE FragmentType = iota FUNCTIONS BLOCKS INSTRUCTIONS )
type FunctionsFragment ¶
func NewFunctionsFragment ¶
func NewFunctionsFragment() *FunctionsFragment
func (*FunctionsFragment) AddFunc ¶
func (functionsFragment *FunctionsFragment) AddFunc(function *ir.Func)
func (*FunctionsFragment) Append ¶
func (functionsFragment *FunctionsFragment) Append(fragment Fragment)
func (*FunctionsFragment) AppendWithResultPropogation ¶
func (functionsFragment *FunctionsFragment) AppendWithResultPropogation(fragment Fragment)
func (*FunctionsFragment) GetResult ¶
func (functionsFragment *FunctionsFragment) GetResult() value.Value
func (*FunctionsFragment) GetResultType ¶
func (functionsFragment *FunctionsFragment) GetResultType() ResultType
type GlobalIdentifierTracker ¶
type GlobalIdentifierTracker struct {
// contains filtered or unexported fields
}
GlobalIdentifierTracker manages creating new global identifiers State is managed on a function level
func (*GlobalIdentifierTracker) CurrentIdentifier ¶
func (globalIdentifierTracker *GlobalIdentifierTracker) CurrentIdentifier() string
func (*GlobalIdentifierTracker) NewIdentifier ¶
func (globalIdentifierTracker *GlobalIdentifierTracker) NewIdentifier() string
func (*GlobalIdentifierTracker) Reset ¶
func (globalIdentifierTracker *GlobalIdentifierTracker) Reset()
type IdentifierTracker ¶
IdentifierTracker keeps track of identifiers in llvm ir
type Instruction ¶
type Instruction struct {
Result string // resulting local variable, if exists
Operation string // actual operation
}
Instruction is one line of instruction in ir
func (*Instruction) Line ¶
func (instruction *Instruction) Line() string
type InstructionsFragment ¶
type InstructionsFragment struct {
Instructions []ir.Instruction
// contains filtered or unexported fields
}
func NewInstructionsFragment ¶
func NewInstructionsFragment(resultType ResultType) *InstructionsFragment
func (*InstructionsFragment) AddInstruction ¶
func (instructionsFragment *InstructionsFragment) AddInstruction(instr ir.Instruction)
func (*InstructionsFragment) Append ¶
func (instructionsFragment *InstructionsFragment) Append(fragment Fragment)
func (*InstructionsFragment) AppendWithResultPropogation ¶
func (instructionsFragment *InstructionsFragment) AppendWithResultPropogation(fragment Fragment)
func (*InstructionsFragment) GetResult ¶
func (instructionsFragment *InstructionsFragment) GetResult() value.Value
func (*InstructionsFragment) GetResultType ¶
func (instructionsFragment *InstructionsFragment) GetResultType() ResultType
type Labeller ¶
type Labeller struct {
// contains filtered or unexported fields
}
Labeller manages creating new labels that are never used before state is managed on a module level
type LocalIdentifierTracker ¶
type LocalIdentifierTracker struct {
// contains filtered or unexported fields
}
LocalIdentifierTracker manages creating new local variables in current function scope State is managed on a function level
func (*LocalIdentifierTracker) CurrentIdentifier ¶
func (localIdentifierTracker *LocalIdentifierTracker) CurrentIdentifier() string
func (*LocalIdentifierTracker) NewIdentifier ¶
func (localIdentifierTracker *LocalIdentifierTracker) NewIdentifier() string
func (*LocalIdentifierTracker) Reset ¶
func (localIdentifierTracker *LocalIdentifierTracker) Reset()
type ModuleFragment ¶
func NewModuleFragment ¶
func NewModuleFragment(module *ir.Module) *ModuleFragment
func (*ModuleFragment) Append ¶
func (moduleFragment *ModuleFragment) Append(fragment Fragment)
func (*ModuleFragment) AppendWithResultPropogation ¶
func (moduleFragment *ModuleFragment) AppendWithResultPropogation(fragment Fragment)
func (*ModuleFragment) GetResult ¶
func (moduleFragment *ModuleFragment) GetResult() value.Value
func (*ModuleFragment) GetResultType ¶
func (moduleFragment *ModuleFragment) GetResultType() ResultType
type OperatorCodegen ¶
type OperatorCodegen struct {
// contains filtered or unexported fields
}
func NewOperatorCodegen ¶
func NewOperatorCodegen(fragment *BlocksFragment, operator signature.Operator, typing typing.Typing, labeller *Labeller, operands ...Fragment) *OperatorCodegen
func (*OperatorCodegen) GenerateCode ¶
func (gen *OperatorCodegen) GenerateCode()
func (*OperatorCodegen) GenerateComparisonInstr ¶
func (gen *OperatorCodegen) GenerateComparisonInstr(frag *BlocksFragment) func(value.Value, value.Value) value.Value
type ResultType ¶
type ResultType int
const ( VOID ResultType = iota // fragment will not produce a value VALUE // fragment will produce a value POINTER // fragment will produce a pointer value )