mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 00:30:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			139 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);
 | |
| }
 | 
