diff options
Diffstat (limited to 'src/pkg/exp/eval/compiler.go')
-rw-r--r-- | src/pkg/exp/eval/compiler.go | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/pkg/exp/eval/compiler.go b/src/pkg/exp/eval/compiler.go new file mode 100644 index 000000000..f3c962c2b --- /dev/null +++ b/src/pkg/exp/eval/compiler.go @@ -0,0 +1,97 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package eval + +import ( + "fmt"; + "go/scanner"; + "go/token"; +) + + +type positioned interface { + Pos() token.Position; +} + + +// A compiler captures information used throughout an entire +// compilation. Currently it includes only the error handler. +// +// TODO(austin) This might actually represent package level, in which +// case it should be package compiler. +type compiler struct { + errors scanner.ErrorHandler; + numErrors int; + silentErrors int; +} + +func (a *compiler) diagAt(pos positioned, format string, args ...) { + a.errors.Error(pos.Pos(), fmt.Sprintf(format, args)); + a.numErrors++; +} + +func (a *compiler) numError() int { + return a.numErrors + a.silentErrors; +} + +// The universal scope +func newUniverse() *Scope { + sc := &Scope{nil, 0}; + sc.block = &block{ + offset: 0, + scope: sc, + global: true, + defs: make(map[string] Def) + }; + return sc; +} +var universe *Scope = newUniverse(); + + +// TODO(austin) These can all go in stmt.go now +type label struct { + name string; + desc string; + // The PC goto statements should jump to, or nil if this label + // cannot be goto'd (such as an anonymous for loop label). + gotoPC *uint; + // The PC break statements should jump to, or nil if a break + // statement is invalid. + breakPC *uint; + // The PC continue statements should jump to, or nil if a + // continue statement is invalid. + continuePC *uint; + // The position where this label was resolved. If it has not + // been resolved yet, an invalid position. + resolved token.Position; + // The position where this label was first jumped to. + used token.Position; +} + +// A funcCompiler captures information used throughout the compilation +// of a single function body. +type funcCompiler struct { + *compiler; + fnType *FuncType; + // Whether the out variables are named. This affects what + // kinds of return statements are legal. + outVarsNamed bool; + *codeBuf; + flow *flowBuf; + labels map[string] *label; +} + +// A blockCompiler captures information used throughout the compilation +// of a single block within a function. +type blockCompiler struct { + *funcCompiler; + block *block; + // The label of this block, used for finding break and + // continue labels. + label *label; + // The blockCompiler for the block enclosing this one, or nil + // for a function-level block. + parent *blockCompiler; +} |