func compile(ctx *context, n node.Node) { switch n.Type() { case node.Int, node.Text: compileLiteral(ctx, n) case node.FetchSymbol: compileFetchSymbol(ctx, n.(*node.TextNode)) case node.FetchField: compileFetchField(ctx, n.(*node.FetchFieldNode)) case node.FetchArrayElement: compileFetchArrayElement(ctx, n.(*node.BinaryNode)) case node.LocalVar: compileLoadLvar(ctx, n.(*node.LocalVarNode)) case node.Assignment: compileAssignment(ctx, n.(*node.AssignmentNode)) case node.Print: compilePrint(ctx, n.(*node.ListNode)) case node.PrintRaw: compilePrintRaw(ctx, n.(*node.ListNode)) case node.Foreach: compileForeach(ctx, n.(*node.ForeachNode)) case node.While: compileWhile(ctx, n.(*node.WhileNode)) case node.If: compileIf(ctx, n.(*node.IfNode)) case node.Else: compileElse(ctx, n.(*node.ElseNode)) case node.MakeArray: compileMakeArray(ctx, n.(*node.UnaryNode)) case node.Range: compileRange(ctx, n.(*node.BinaryNode)) case node.List: compileList(ctx, n.(*node.ListNode)) case node.FunCall: compileFunCall(ctx, n.(*node.FunCallNode)) case node.MethodCall: compileMethodCall(ctx, n.(*node.MethodCallNode)) case node.Include: compileInclude(ctx, n.(*node.IncludeNode)) case node.Group: compile(ctx, n.(*node.UnaryNode).Child) case node.Equals, node.NotEquals, node.LT, node.GT: compileComparison(ctx, n.(*node.BinaryNode)) case node.Plus, node.Minus, node.Mul, node.Div: compileBinaryArithmetic(ctx, n.(*node.BinaryNode)) case node.Filter: compileFilter(ctx, n.(*node.FilterNode)) case node.Wrapper: compileWrapper(ctx, n.(*node.WrapperNode)) case node.Macro: compileMacro(ctx, n.(*node.MacroNode)) default: fmt.Printf("Unknown node: %s\n", n.Type()) } }
func compileLiteral(ctx *context, n node.Node) { var op vm.Op switch n.Type() { case node.Int: op = ctx.AppendOp(vm.TXOPLiteral, n.(*node.NumberNode).Value.Int()) case node.Text: op = ctx.AppendOp(vm.TXOPLiteral, n.(*node.TextNode).Text) default: panic("unknown literal value") } op.SetComment("Save literal to sa") }