mirror of
https://github.com/golang/go
synced 2024-11-13 18:30:26 -07:00
333b70bee0
R=r OCL=13932 CL=13932
140 lines
2.3 KiB
Go
140 lines
2.3 KiB
Go
// 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 AST
|
|
|
|
import Globals "globals"
|
|
import Universe "universe"
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Expressions
|
|
|
|
|
|
export type Literal struct {
|
|
pos_ int;
|
|
typ_ *Globals.Type;
|
|
b bool;
|
|
i int;
|
|
f float;
|
|
s string;
|
|
}
|
|
|
|
|
|
func (x *Literal) pos() int {
|
|
return x.pos_;
|
|
}
|
|
|
|
|
|
func (x *Literal) typ() *Globals.Type {
|
|
return x.typ_;
|
|
}
|
|
|
|
|
|
export func NewLiteral(pos int, typ *Globals.Type) *Literal {
|
|
x := new(Literal);
|
|
x.pos_ = pos;
|
|
x.typ_ = typ;
|
|
return x;
|
|
}
|
|
|
|
|
|
export var Bad, True, False, Nil *Literal;
|
|
|
|
|
|
// NOTE We could use Globals.Object directly if we'd added a typ()
|
|
// method to its interface. However, this would require renaming the
|
|
// typ field everywhere... - Need to think about accessors again.
|
|
export type Object struct {
|
|
pos_ int;
|
|
obj *Globals.Object;
|
|
}
|
|
|
|
|
|
func (x *Object) pos() int {
|
|
return x.pos_;
|
|
}
|
|
|
|
|
|
func (x *Object) typ() *Globals.Type {
|
|
return x.obj.typ;
|
|
}
|
|
|
|
|
|
export func NewObject(pos int, obj* Globals.Object) *Object {
|
|
x := new(Object);
|
|
x.pos_ = pos;
|
|
x.obj = obj;
|
|
return x;
|
|
}
|
|
|
|
|
|
// TODO model Selector as binary operation?
|
|
export type Selector struct {
|
|
pos_ int;
|
|
typ_ *Globals.Type;
|
|
}
|
|
|
|
|
|
func (x *Selector) pos() int {
|
|
return x.pos_;
|
|
}
|
|
|
|
|
|
func (x *Selector) typ() *Globals.Type {
|
|
return x.typ_;
|
|
}
|
|
|
|
|
|
export func NewSelector(pos int, typ *Globals.Type) *Selector {
|
|
x := new(Selector);
|
|
x.pos_ = pos;
|
|
x.typ_ = typ;
|
|
return x;
|
|
}
|
|
|
|
|
|
export type BinaryExpr struct {
|
|
pos_ int;
|
|
typ_ *Globals.Type;
|
|
op int;
|
|
x, y Globals.Expr;
|
|
}
|
|
|
|
|
|
func (x *BinaryExpr) pos() int {
|
|
return x.pos_;
|
|
}
|
|
|
|
|
|
func (x *BinaryExpr) typ() *Globals.Type {
|
|
return x.typ_;
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Statements
|
|
|
|
export type Block struct {
|
|
// TODO fill in
|
|
}
|
|
|
|
|
|
export type IfStat struct {
|
|
cond Globals.Expr;
|
|
then_ Globals.Stat;
|
|
else_ Globals.Stat;
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Initialization
|
|
|
|
func init() {
|
|
Bad = NewLiteral(-1, Universe.bad_t);
|
|
True = NewLiteral(-1, Universe.bool_t); True.b = true;
|
|
False = NewLiteral(-1, Universe.bool_t); False.b = false;
|
|
Nil = NewLiteral(-1, Universe.nil_t);
|
|
}
|