Exemple #1
0
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())
	}
}
Exemple #2
0
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")
}