ast

package
v0.3.0-alpha Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 4, 2024 License: MIT Imports: 8 Imported by: 2

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func IsExternFunc

func IsExternFunc(fun *FuncDecl) bool

check if the function is defined externally

func IsGlobalScope

func IsGlobalScope(table *SymbolTable) bool

returns wether table is the global scope table.Enclosing == nil

func IterateImportedDecls

func IterateImportedDecls(imprt *ImportStmt, fun func(name string, decl Declaration, tok token.Token) bool)

applies fun to all declarations imported by imprt if len(imprt.ImportedSymbols) == 0, it is applied to all imprt.Module.PublicDecls, in which case the declarations are sorted by occurence in the source file otherwise to every tok in imprt.ImportedSymbols is used

  • name is the name of the declaration (or the literal of imprt.ImportedSymbols if no decl is found)
  • decl is nil if imprt.ImportedSymbols[x] is not present in import.Module.PublicDecls
  • tok refers either to the string literal of the import path, or to the identifier from imprt.ImportedSymbols

the return value of fun indicates wether the iteration should continue or if we break true means continue, false means break

func IterateModuleImports

func IterateModuleImports(module *Module, fun func(*Module))

Calls fun with module and every module it imports recursively meaning fun is called on module, all of its imports and all of their imports and so on a single time per module

func TrimStringLit

func TrimStringLit(lit *token.Token) string

trims the "" from the literal

func VisitModule

func VisitModule(module *Module, visitor Visitor)

visits the AST of the given module

visitor can implement any of the Visit<Node> interfaces, and the corresponding method is called for each node

if the given Visitor implements the ConditionalVisitor interface, the ShouldVisit method is used to determine if a node should be visited

if the given Visitor implements the ScopeSetter interface, the SetScope method is called when the scope changes

if the given Visitor implements the ModuleSetter interface, the SetModule method is called before visiting the module

func VisitModuleRec

func VisitModuleRec(module *Module, visitor Visitor)

visits the given module and all the modules it imports recursively

visitor can implement any of the Visit<Node> interfaces, and the corresponding method is called for each node

imported modules are visited in the order they are included

if the given Visitor implements the ConditionalVisitor interface, the ShouldVisit method is used to determine if a node should be visited

if the given Visitor implements the ScopeSetter interface, the SetScope method is called when the scope changes

if the given Visitor implements the ModuleSetter interface, the SetModule method is called before visiting each module

func VisitNode

func VisitNode(visitor Visitor, node Node, currentScope *SymbolTable)

visits the given node and all its children recursively

visitor can implement any of the Visit<Node> interfaces, and the corresponding method is called for each node

if the given Visitor implements the ConditionalVisitor interface, the ShouldVisit method is used to determine if a node should be visited

if the given Visitor implements the ScopeSetter interface, the SetScope method is called when the scope changes

Types

type Alias

type Alias interface {
	// tokens of the alias
	GetTokens() []token.Token
	// the original string
	GetOriginal() token.Token
	// *FuncDecl or *StructDecl
	Decl() Declaration
	// types of the arguments (used for funcCall parsing)
	GetArgs() map[string]ddptypes.ParameterType
}

interface for a alias of either a function or a struct constructor

type Annotator

type Annotator Visitor

Annotator is a Visitor that can be used to annotate an AST with Metadata

type AssignStmt

type AssignStmt struct {
	Range token.Range
	Tok   token.Token
	Var   Assigneable // the variable to assign to
	Rhs   Expression  // literal assign value
}

Statements

func (*AssignStmt) Accept

func (stmt *AssignStmt) Accept(v FullVisitor) VisitResult

func (*AssignStmt) GetRange

func (stmt *AssignStmt) GetRange() token.Range

func (*AssignStmt) String

func (stmt *AssignStmt) String() string

func (*AssignStmt) Token

func (stmt *AssignStmt) Token() token.Token

type AssignStmtVisitor

type AssignStmtVisitor interface {
	Visitor
	VisitAssignStmt(*AssignStmt) VisitResult
}

type Assigneable

type Assigneable interface {
	Expression
	// contains filtered or unexported methods
}

*Ident or *Indexing Nodes that fulfill this interface can be on the left side of an assignement (meaning, variables or references)

type Ast

type Ast struct {
	Statements []Statement   // the top level statements
	Comments   []token.Token // all the comments in the source code
	Symbols    *SymbolTable
	Faulty     bool // set if the ast has any errors (doesn't matter what from which phase they came)
	// contains filtered or unexported fields
}

represents an Abstract Syntax Tree for a DDP program

func (*Ast) AddAttachement

func (ast *Ast) AddAttachement(node Node, attachment MetadataAttachment)

adds metadata to the given node

func (*Ast) GetMetadata

func (ast *Ast) GetMetadata(node Node) (Metadata, bool)

returns all the metadata attached to the given node

func (*Ast) GetMetadataByKind

func (ast *Ast) GetMetadataByKind(node Node, kind MetadataKind) (MetadataAttachment, bool)

returns the metadata of the given kind attached to the given node

func (*Ast) Print

func (ast *Ast) Print()

print the AST to stdout

func (*Ast) RemoveAttachment

func (ast *Ast) RemoveAttachment(node Node, kind MetadataKind)

removes metadata of the given kind from the given node

func (*Ast) String

func (ast *Ast) String() string

returns a string representation of the AST as S-Expressions

type BadDecl

type BadDecl struct {
	Tok token.Token
	Err ddperror.Error
	Mod *Module
}

an invalid Declaration

func (*BadDecl) Accept

func (decl *BadDecl) Accept(visitor FullVisitor) VisitResult

func (*BadDecl) Comment

func (decl *BadDecl) Comment() *token.Token

func (*BadDecl) GetRange

func (decl *BadDecl) GetRange() token.Range

func (*BadDecl) Module

func (decl *BadDecl) Module() *Module

func (*BadDecl) Name

func (decl *BadDecl) Name() string

func (*BadDecl) Public

func (decl *BadDecl) Public() bool

func (*BadDecl) String

func (decl *BadDecl) String() string

func (*BadDecl) Token

func (decl *BadDecl) Token() token.Token

type BadDeclVisitor

type BadDeclVisitor interface {
	Visitor
	VisitBadDecl(*BadDecl) VisitResult
}

type BadExpr

type BadExpr struct {
	Tok token.Token
	Err ddperror.Error
}

Expressions

func (*BadExpr) Accept

func (expr *BadExpr) Accept(v FullVisitor) VisitResult

func (*BadExpr) GetRange

func (expr *BadExpr) GetRange() token.Range

func (*BadExpr) String

func (expr *BadExpr) String() string

func (*BadExpr) Token

func (expr *BadExpr) Token() token.Token

type BadExprVisitor

type BadExprVisitor interface {
	Visitor
	VisitBadExpr(*BadExpr) VisitResult
}

type BadStmt

type BadStmt struct {
	Tok token.Token
	Err ddperror.Error
}

Statements

func (*BadStmt) Accept

func (stmt *BadStmt) Accept(v FullVisitor) VisitResult

func (*BadStmt) GetRange

func (stmt *BadStmt) GetRange() token.Range

func (*BadStmt) String

func (stmt *BadStmt) String() string

func (*BadStmt) Token

func (stmt *BadStmt) Token() token.Token

type BadStmtVisitor

type BadStmtVisitor interface {
	Visitor
	VisitBadStmt(*BadStmt) VisitResult
}

type BaseVisitor

type BaseVisitor struct {
	// the current module being visited
	CurrentModule *Module
	// the current scope
	CurrentScope *SymbolTable
	// Condition to check if a node should be visited
	// if nil, all nodes are visited
	VisitCondition func(Node) bool
}

A base visitor that can be embedded in other visitors to provide a default implementation for all methods and other utility functionality

func (*BaseVisitor) SetModule

func (v *BaseVisitor) SetModule(m *Module)

func (*BaseVisitor) SetScope

func (v *BaseVisitor) SetScope(s *SymbolTable)

func (*BaseVisitor) ShouldVisit

func (v *BaseVisitor) ShouldVisit(n Node) bool

func (*BaseVisitor) Visitor

func (v *BaseVisitor) Visitor()

type BinaryExpr

type BinaryExpr struct {
	Range    token.Range
	Tok      token.Token
	Lhs      Expression
	Operator BinaryOperator
	Rhs      Expression
}

Expressions

func (*BinaryExpr) Accept

func (expr *BinaryExpr) Accept(v FullVisitor) VisitResult

func (*BinaryExpr) GetRange

func (expr *BinaryExpr) GetRange() token.Range

func (*BinaryExpr) String

func (expr *BinaryExpr) String() string

func (*BinaryExpr) Token

func (expr *BinaryExpr) Token() token.Token

type BinaryExprVisitor

type BinaryExprVisitor interface {
	Visitor
	VisitBinaryExpr(*BinaryExpr) VisitResult
}

type BinaryOperator

type BinaryOperator int
const (
	BIN_INVALID      BinaryOperator = iota
	BIN_AND                         // und
	BIN_OR                          // oder
	BIN_CONCAT                      // verkettet
	BIN_PLUS                        // plus
	BIN_MINUS                       // minus
	BIN_MULT                        // mal
	BIN_DIV                         // durch
	BIN_INDEX                       // an der Stelle
	BIN_POW                         // hoch
	BIN_LOG                         // Logarithmus
	BIN_LOGIC_AND                   // logisch und
	BIN_LOGIC_OR                    // logisch oder
	BIN_LOGIC_XOR                   // logisch kontra
	BIN_MOD                         // modulo
	BIN_LEFT_SHIFT                  // links verschoben
	BIN_RIGHT_SHIFT                 // rechts verschoben
	BIN_EQUAL                       // gleich
	BIN_UNEQUAL                     // ungleich
	BIN_LESS                        // kleiner
	BIN_GREATER                     // größer
	BIN_LESS_EQ                     // kleiner als, oder
	BIN_GREATER_EQ                  // größer als, oder
	BIN_FIELD_ACCESS                // von
	BIN_SLICE_TO                    // bis zum
	BIN_SLICE_FROM                  // ab dem
)

func (BinaryOperator) Operator

func (BinaryOperator) Operator()

func (BinaryOperator) String

func (op BinaryOperator) String() string

type BlockStmt

type BlockStmt struct {
	Range      token.Range
	Colon      token.Token
	Statements []Statement
	Symbols    *SymbolTable
}

Statements

func (*BlockStmt) Accept

func (stmt *BlockStmt) Accept(v FullVisitor) VisitResult

func (*BlockStmt) GetRange

func (stmt *BlockStmt) GetRange() token.Range

func (*BlockStmt) String

func (stmt *BlockStmt) String() string

func (*BlockStmt) Token

func (stmt *BlockStmt) Token() token.Token

type BlockStmtVisitor

type BlockStmtVisitor interface {
	Visitor
	VisitBlockStmt(*BlockStmt) VisitResult
}

type BoolLit

type BoolLit struct {
	Literal token.Token
	Value   bool
}

Expressions

func (*BoolLit) Accept

func (expr *BoolLit) Accept(v FullVisitor) VisitResult

func (*BoolLit) GetRange

func (expr *BoolLit) GetRange() token.Range

func (*BoolLit) String

func (expr *BoolLit) String() string

func (*BoolLit) Token

func (expr *BoolLit) Token() token.Token

type BoolLitVisitor

type BoolLitVisitor interface {
	Visitor
	VisitBoolLit(*BoolLit) VisitResult
}

type BreakContineStmtVisitor

type BreakContineStmtVisitor interface {
	Visitor
	VisitBreakContinueStmt(*BreakContinueStmt) VisitResult
}

type BreakContinueStmt

type BreakContinueStmt struct {
	Range token.Range
	Tok   token.Token // VERLASSE for break, otherwise continue
}

Statements

func (*BreakContinueStmt) Accept

func (stmt *BreakContinueStmt) Accept(v FullVisitor) VisitResult

func (*BreakContinueStmt) GetRange

func (stmt *BreakContinueStmt) GetRange() token.Range

func (*BreakContinueStmt) String

func (stmt *BreakContinueStmt) String() string

func (*BreakContinueStmt) Token

func (stmt *BreakContinueStmt) Token() token.Token

type CastExpr

type CastExpr struct {
	Range token.Range
	Type  ddptypes.Type
	Lhs   Expression
}

als Expressions cannot be unary because the type operator might be multiple tokens long

func (*CastExpr) Accept

func (expr *CastExpr) Accept(v FullVisitor) VisitResult

func (*CastExpr) GetRange

func (expr *CastExpr) GetRange() token.Range

func (*CastExpr) String

func (expr *CastExpr) String() string

func (*CastExpr) Token

func (expr *CastExpr) Token() token.Token

type CastExprVisitor

type CastExprVisitor interface {
	Visitor
	VisitCastExpr(*CastExpr) VisitResult
}

type CharLit

type CharLit struct {
	Literal token.Token
	Value   rune
}

Expressions

func (*CharLit) Accept

func (expr *CharLit) Accept(v FullVisitor) VisitResult

func (*CharLit) GetRange

func (expr *CharLit) GetRange() token.Range

func (*CharLit) String

func (expr *CharLit) String() string

func (*CharLit) Token

func (expr *CharLit) Token() token.Token

type CharLitVisitor

type CharLitVisitor interface {
	Visitor
	VisitCharLit(*CharLit) VisitResult
}

type ConditionalVisitor

type ConditionalVisitor interface {
	Visitor
	// Condition to check if a node should be visited
	ShouldVisit(Node) bool
}

when using the Visit* utility functions, this interface can be implemented to provide a condition to check if a node should be visited

type DeclStmt

type DeclStmt struct {
	Decl Declaration
}

Statements

func (*DeclStmt) Accept

func (stmt *DeclStmt) Accept(v FullVisitor) VisitResult

func (*DeclStmt) GetRange

func (stmt *DeclStmt) GetRange() token.Range

func (*DeclStmt) String

func (stmt *DeclStmt) String() string

func (*DeclStmt) Token

func (stmt *DeclStmt) Token() token.Token

type DeclStmtVisitor

type DeclStmtVisitor interface {
	Visitor
	VisitDeclStmt(*DeclStmt) VisitResult
}

type Declaration

type Declaration interface {
	Node

	Name() string          // returns the name of the declaration or "" for BadDecls
	Public() bool          // returns wether the declaration is public. always false for BadDecls
	Comment() *token.Token // returns a optional comment
	Module() *Module       // returns the module from which the declaration comes
	// contains filtered or unexported methods
}

basic Node interfaces

type ExprStmt

type ExprStmt struct {
	Expr Expression
}

Statements

func (*ExprStmt) Accept

func (stmt *ExprStmt) Accept(v FullVisitor) VisitResult

func (*ExprStmt) GetRange

func (stmt *ExprStmt) GetRange() token.Range

func (*ExprStmt) String

func (stmt *ExprStmt) String() string

func (*ExprStmt) Token

func (stmt *ExprStmt) Token() token.Token

type ExprStmtVisitor

type ExprStmtVisitor interface {
	Visitor
	VisitExprStmt(*ExprStmt) VisitResult
}

type Expression

type Expression interface {
	Node
	// contains filtered or unexported methods
}

basic Node interfaces

type FieldAccess

type FieldAccess struct {
	Rhs   Assigneable // variable Name or other indexing
	Field *Ident      // the field name
}

also exists as Binary expression for Literals this one can count as Reference, and my be used inplace of Ident (may be assigned to etc.)

func (*FieldAccess) Accept

func (expr *FieldAccess) Accept(v FullVisitor) VisitResult

func (*FieldAccess) GetRange

func (expr *FieldAccess) GetRange() token.Range

func (*FieldAccess) String

func (expr *FieldAccess) String() string

func (*FieldAccess) Token

func (expr *FieldAccess) Token() token.Token

type FieldAccessVisitor

type FieldAccessVisitor interface {
	Visitor
	VisitFieldAccess(*FieldAccess) VisitResult
}

type FloatLit

type FloatLit struct {
	Literal token.Token
	Value   float64 // the parsed float
}

Expressions

func (*FloatLit) Accept

func (expr *FloatLit) Accept(v FullVisitor) VisitResult

func (*FloatLit) GetRange

func (expr *FloatLit) GetRange() token.Range

func (*FloatLit) String

func (expr *FloatLit) String() string

func (*FloatLit) Token

func (expr *FloatLit) Token() token.Token

type FloatLitVisitor

type FloatLitVisitor interface {
	Visitor
	VisitFloatLit(*FloatLit) VisitResult
}

type ForRangeStmt

type ForRangeStmt struct {
	Range       token.Range
	For         token.Token // Für
	Initializer *VarDecl    // InitVal is the same pointer as In
	In          Expression  // the string/list to range over
	Body        *BlockStmt
}

Statements

func (*ForRangeStmt) Accept

func (stmt *ForRangeStmt) Accept(v FullVisitor) VisitResult

func (*ForRangeStmt) GetRange

func (stmt *ForRangeStmt) GetRange() token.Range

func (*ForRangeStmt) String

func (stmt *ForRangeStmt) String() string

func (*ForRangeStmt) Token

func (stmt *ForRangeStmt) Token() token.Token

type ForRangeStmtVisitor

type ForRangeStmtVisitor interface {
	Visitor
	VisitForRangeStmt(*ForRangeStmt) VisitResult
}

type ForStmt

type ForStmt struct {
	Range       token.Range
	For         token.Token // Für
	Initializer *VarDecl    // Zahl (name) von (Initializer.InitVal)
	To          Expression  // bis (To)
	StepSize    Expression  // Schrittgröße
	Body        *BlockStmt
}

Statements

func (*ForStmt) Accept

func (stmt *ForStmt) Accept(v FullVisitor) VisitResult

func (*ForStmt) GetRange

func (stmt *ForStmt) GetRange() token.Range

func (*ForStmt) String

func (stmt *ForStmt) String() string

func (*ForStmt) Token

func (stmt *ForStmt) Token() token.Token

type ForStmtVisitor

type ForStmtVisitor interface {
	Visitor
	VisitForStmt(*ForStmt) VisitResult
}

type FuncAlias

type FuncAlias struct {
	Tokens   []token.Token                     // tokens of the alias
	Original token.Token                       // the original string
	Func     *FuncDecl                         // the function it refers to (if it is used outside a FuncDecl)
	Args     map[string]ddptypes.ParameterType // types of the arguments (used for funcCall parsing)
}

wrapper for a function alias

func (*FuncAlias) Decl

func (alias *FuncAlias) Decl() Declaration

func (*FuncAlias) GetArgs

func (alias *FuncAlias) GetArgs() map[string]ddptypes.ParameterType

func (*FuncAlias) GetOriginal

func (alias *FuncAlias) GetOriginal() token.Token

func (*FuncAlias) GetTokens

func (alias *FuncAlias) GetTokens() []token.Token

type FuncCall

type FuncCall struct {
	Range token.Range
	Tok   token.Token // first token of the call
	Name  string      // name of the function
	// the function declaration this call refers to
	// is set by the parser, or nil if the name was not found
	Func *FuncDecl
	Args map[string]Expression
}

Expressions

func (*FuncCall) Accept

func (expr *FuncCall) Accept(v FullVisitor) VisitResult

func (*FuncCall) GetRange

func (expr *FuncCall) GetRange() token.Range

func (*FuncCall) String

func (expr *FuncCall) String() string

func (*FuncCall) Token

func (expr *FuncCall) Token() token.Token

type FuncCallVisitor

type FuncCallVisitor interface {
	Visitor
	VisitFuncCall(*FuncCall) VisitResult
}

type FuncDecl

type FuncDecl struct {
	Range         token.Range
	CommentTok    *token.Token             // optional comment (also contained in ast.Comments)
	Tok           token.Token              // Die
	NameTok       token.Token              // token of the name
	IsPublic      bool                     // wether the function is marked with öffentliche
	Mod           *Module                  // the module in which the function was declared
	ParamNames    []token.Token            // x, y und z
	ParamTypes    []ddptypes.ParameterType // type, and wether the argument is a reference
	ParamComments []*token.Token           // comments for the parameters, the slice or its elements may be nil
	Type          ddptypes.Type            // return Type, Zahl Kommazahl nichts ...
	Body          *BlockStmt               // nil for extern functions
	ExternFile    token.Token              // string literal with filepath (only pesent if Body is nil)
	Aliases       []*FuncAlias
}

Declarations

func (*FuncDecl) Accept

func (decl *FuncDecl) Accept(visitor FullVisitor) VisitResult

func (*FuncDecl) Comment

func (decl *FuncDecl) Comment() *token.Token

func (*FuncDecl) GetRange

func (decl *FuncDecl) GetRange() token.Range

func (*FuncDecl) Module

func (decl *FuncDecl) Module() *Module

func (*FuncDecl) Name

func (decl *FuncDecl) Name() string

func (*FuncDecl) Public

func (decl *FuncDecl) Public() bool

func (*FuncDecl) String

func (decl *FuncDecl) String() string

func (*FuncDecl) Token

func (decl *FuncDecl) Token() token.Token

type FuncDeclVisitor

type FuncDeclVisitor interface {
	Visitor
	VisitFuncDecl(*FuncDecl) VisitResult
}

type Grouping

type Grouping struct {
	Range  token.Range
	LParen token.Token // (
	Expr   Expression
}

Expressions

func (*Grouping) Accept

func (expr *Grouping) Accept(v FullVisitor) VisitResult

func (*Grouping) GetRange

func (expr *Grouping) GetRange() token.Range

func (*Grouping) String

func (expr *Grouping) String() string

func (*Grouping) Token

func (expr *Grouping) Token() token.Token

type GroupingVisitor

type GroupingVisitor interface {
	Visitor
	VisitGrouping(*Grouping) VisitResult
}

type Ident

type Ident struct {
	Literal token.Token
	// the variable declaration this identifier refers to
	// is set by the resolver, or nil if the name was not found
	Declaration *VarDecl
}

Expressions

func (*Ident) Accept

func (expr *Ident) Accept(v FullVisitor) VisitResult

func (*Ident) GetRange

func (expr *Ident) GetRange() token.Range

func (*Ident) String

func (expr *Ident) String() string

func (*Ident) Token

func (expr *Ident) Token() token.Token

type IdentVisitor

type IdentVisitor interface {
	Visitor
	VisitIdent(*Ident) VisitResult
}

type IfStmt

type IfStmt struct {
	Range     token.Range
	If        token.Token // wenn/aber
	Condition Expression
	Then      Statement
	Else      Statement
}

Statements

func (*IfStmt) Accept

func (stmt *IfStmt) Accept(v FullVisitor) VisitResult

func (*IfStmt) GetRange

func (stmt *IfStmt) GetRange() token.Range

func (*IfStmt) String

func (stmt *IfStmt) String() string

func (*IfStmt) Token

func (stmt *IfStmt) Token() token.Token

type IfStmtVisitor

type IfStmtVisitor interface {
	Visitor
	VisitIfStmt(*IfStmt) VisitResult
}

type ImportStmt

type ImportStmt struct {
	Range token.Range
	// the string literal which specified the filename
	FileName token.Token
	// the module that was imported because of this
	// nil if it does not exist or a similar error occured while importing
	Module *Module
	// slice of identifiers which specify
	// the individual symbols imported
	// if nil, all symbols are imported
	ImportedSymbols []token.Token
}

import statement for meta-information in the ast will be already resolved by the parser

func (*ImportStmt) Accept

func (stmt *ImportStmt) Accept(v FullVisitor) VisitResult

func (*ImportStmt) GetRange

func (stmt *ImportStmt) GetRange() token.Range

func (*ImportStmt) String

func (stmt *ImportStmt) String() string

func (*ImportStmt) Token

func (stmt *ImportStmt) Token() token.Token

type ImportStmtVisitor

type ImportStmtVisitor interface {
	Visitor
	VisitImportStmt(*ImportStmt) VisitResult
}

type Indexing

type Indexing struct {
	Lhs   Assigneable // variable Name or other indexing
	Index Expression
}

also exists as Binary expression for Literals this one can count as Reference, and may be used inplace of Ident (may be assigned to etc.)

func (*Indexing) Accept

func (expr *Indexing) Accept(v FullVisitor) VisitResult

func (*Indexing) GetRange

func (expr *Indexing) GetRange() token.Range

func (*Indexing) String

func (expr *Indexing) String() string

func (*Indexing) Token

func (expr *Indexing) Token() token.Token

type IndexingVisitor

type IndexingVisitor interface {
	Visitor
	VisitIndexing(*Indexing) VisitResult
}

type IntLit

type IntLit struct {
	Literal token.Token
	Value   int64
}

Expressions

func (*IntLit) Accept

func (expr *IntLit) Accept(v FullVisitor) VisitResult

func (*IntLit) GetRange

func (expr *IntLit) GetRange() token.Range

func (*IntLit) String

func (expr *IntLit) String() string

func (*IntLit) Token

func (expr *IntLit) Token() token.Token

type IntLitVisitor

type IntLitVisitor interface {
	Visitor
	VisitIntLit(*IntLit) VisitResult
}

type ListLit

type ListLit struct {
	Tok   token.Token
	Range token.Range
	// type of the empty list if Values is nil
	// the typechecker fills this field if Values is non-nil
	Type   ddptypes.ListType
	Values []Expression // the values in the Literal
	// if Values, Count and Value are nil, the list is empty
	Count Expression // for big list initializations
	Value Expression // the default value for big list initializations
}

Expressions

func (*ListLit) Accept

func (expr *ListLit) Accept(v FullVisitor) VisitResult

func (*ListLit) GetRange

func (expr *ListLit) GetRange() token.Range

func (*ListLit) String

func (expr *ListLit) String() string

func (*ListLit) Token

func (expr *ListLit) Token() token.Token

type ListLitVisitor

type ListLitVisitor interface {
	Visitor
	VisitListLit(*ListLit) VisitResult
}

type Metadata

type Metadata struct {
	// Attachements stored by kind
	Attachments map[MetadataKind]MetadataAttachment
}

a collection of MetadataAttachments for a node

func (*Metadata) String

func (md *Metadata) String() string

TODO: make this good

type MetadataAttachment

type MetadataAttachment interface {
	String() string
	// kind of the attachement (e.g. "range", "constant_info", "type_info", etc. or any custom string)
	// should be a unique string for each kind of metadata as it is the key in the
	// attachments map
	Kind() MetadataKind
}

type MetadataKind

type MetadataKind string

type Module

type Module struct {
	// the absolute filepath from which the module comes
	FileName string
	// the token which specified the relative FileName
	// if the module was imported and not the main Module
	FileNameToken *token.Token
	// all the imported modules
	Imports []*ImportStmt
	// a set which contains all files needed
	// to link the final executable
	// contains .c, .lib, .a and .o files
	ExternalDependencies map[string]struct{}
	// the Ast of the Module
	Ast *Ast
	// map of references to all public functions, variables and structs
	PublicDecls map[string]Declaration
}

represents a single DDP Module (source file), it's dependencies and public interface

func (*Module) GetIncludeFilename

func (module *Module) GetIncludeFilename() string

returns the string-literal content by which this module was first imported or the short FileName if it is the main module

type ModuleSetter

type ModuleSetter interface {
	Visitor
	// called before a module is visited
	SetModule(*Module)
}

when using the Visit* utility functions, this interface can be implemented to retreive the current module

type Node

type Node interface {
	fmt.Stringer
	Token() token.Token
	GetRange() token.Range
	Accept(FullVisitor) VisitResult
}

basic Node interfaces

type Operator

type Operator interface {
	String() string
	Operator() // dummy function for the interface
}

interface for operator enums to use them easier in generic functions

type ReturnStmt

type ReturnStmt struct {
	Range  token.Range
	Return token.Token // Gib
	Func   string
	Value  Expression // nil for void return
}

Statements

func (*ReturnStmt) Accept

func (stmt *ReturnStmt) Accept(v FullVisitor) VisitResult

func (*ReturnStmt) GetRange

func (stmt *ReturnStmt) GetRange() token.Range

func (*ReturnStmt) String

func (stmt *ReturnStmt) String() string

func (*ReturnStmt) Token

func (stmt *ReturnStmt) Token() token.Token

type ReturnStmtVisitor

type ReturnStmtVisitor interface {
	Visitor
	VisitReturnStmt(*ReturnStmt) VisitResult
}

type ScopeSetter

type ScopeSetter interface {
	Visitor
	// called before entering a scope in the AST
	SetScope(*SymbolTable)
}

when using the Visit* utility functions, this interface can be implemented to set the current scope

type Statement

type Statement interface {
	Node
	// contains filtered or unexported methods
}

basic Node interfaces

type StringLit

type StringLit struct {
	Literal token.Token
	Value   string // the evaluated string
}

Expressions

func (*StringLit) Accept

func (expr *StringLit) Accept(v FullVisitor) VisitResult

func (*StringLit) GetRange

func (expr *StringLit) GetRange() token.Range

func (*StringLit) String

func (expr *StringLit) String() string

func (*StringLit) Token

func (expr *StringLit) Token() token.Token

type StringLitVisitor

type StringLitVisitor interface {
	Visitor
	VisitStringLit(*StringLit) VisitResult
}

type StructAlias

type StructAlias struct {
	Tokens   []token.Token            // tokens of the alias
	Original token.Token              // the original string
	Struct   *StructDecl              // the struct decl it refers to
	Args     map[string]ddptypes.Type // types of the arguments (only those that the alias needs)
}

wrapper for a struct alias

func (*StructAlias) Decl

func (alias *StructAlias) Decl() Declaration

func (*StructAlias) GetArgs

func (alias *StructAlias) GetArgs() map[string]ddptypes.ParameterType

func (*StructAlias) GetOriginal

func (alias *StructAlias) GetOriginal() token.Token

func (*StructAlias) GetTokens

func (alias *StructAlias) GetTokens() []token.Token

type StructDecl

type StructDecl struct {
	Range      token.Range
	CommentTok *token.Token // optional comment (also contained in ast.Comments)
	Tok        token.Token  // Wir
	NameTok    token.Token  // token of the name
	IsPublic   bool         // wether the struct decl is marked with öffentliche
	Mod        *Module      // the module in which the struct was declared
	// Field declarations of the struct in order of declaration
	// only contains *VarDecl and *BadDecl s
	Fields  []Declaration
	Type    *ddptypes.StructType // the type resulting from this decl
	Aliases []*StructAlias       // the constructors of the struct
}

Declarations

func (*StructDecl) Accept

func (decl *StructDecl) Accept(visitor FullVisitor) VisitResult

func (*StructDecl) Comment

func (decl *StructDecl) Comment() *token.Token

func (*StructDecl) GetRange

func (decl *StructDecl) GetRange() token.Range

func (*StructDecl) Module

func (decl *StructDecl) Module() *Module

func (*StructDecl) Name

func (decl *StructDecl) Name() string

func (*StructDecl) Public

func (decl *StructDecl) Public() bool

func (*StructDecl) String

func (decl *StructDecl) String() string

func (*StructDecl) Token

func (decl *StructDecl) Token() token.Token

type StructDeclVisitor

type StructDeclVisitor interface {
	Visitor
	VisitStructDecl(*StructDecl) VisitResult
}

type StructLiteral

type StructLiteral struct {
	Range token.Range
	Tok   token.Token // first token of the literal
	// the struct declaration this literal refers to
	// is set by the parser, or nil if the name was not found
	Struct *StructDecl
	// the arguments passed to the literal
	// this does not include all struct fields,
	// only the ones needed by the alias used
	Args map[string]Expression
}

Expressions

func (*StructLiteral) Accept

func (expr *StructLiteral) Accept(v FullVisitor) VisitResult

func (*StructLiteral) GetRange

func (expr *StructLiteral) GetRange() token.Range

func (*StructLiteral) String

func (expr *StructLiteral) String() string

func (*StructLiteral) Token

func (expr *StructLiteral) Token() token.Token

type StructLiteralVisitor

type StructLiteralVisitor interface {
	Visitor
	VisitStructLiteral(*StructLiteral) VisitResult
}

type SymbolTable

type SymbolTable struct {
	Enclosing    *SymbolTable           // enclosing scope (nil in the global scope)
	Declarations map[string]Declaration // map of all variables, functions and structs
}

stores symbols for one scope of an ast

func NewSymbolTable

func NewSymbolTable(enclosing *SymbolTable) *SymbolTable

func (*SymbolTable) InsertDecl

func (scope *SymbolTable) InsertDecl(name string, decl Declaration) bool

inserts a declaration into the scope if it didn't exist yet and returns wether it already existed BadDecls are ignored

func (*SymbolTable) LookupDecl

func (scope *SymbolTable) LookupDecl(name string) (Declaration, bool, bool)

returns the declaration corresponding to name and wether it exists if the symbol existed, the second bool is true, if it is a variable and false if it is a funciton call like this: decl, exists, isVar := LookupDecl(name)

type TernaryExpr

type TernaryExpr struct {
	Range    token.Range
	Tok      token.Token
	Lhs      Expression
	Mid      Expression
	Rhs      Expression
	Operator TernaryOperator
}

currently only used for von bis

func (*TernaryExpr) Accept

func (expr *TernaryExpr) Accept(v FullVisitor) VisitResult

func (*TernaryExpr) GetRange

func (expr *TernaryExpr) GetRange() token.Range

func (*TernaryExpr) String

func (expr *TernaryExpr) String() string

func (*TernaryExpr) Token

func (expr *TernaryExpr) Token() token.Token

type TernaryExprVisitor

type TernaryExprVisitor interface {
	Visitor
	VisitTernaryExpr(*TernaryExpr) VisitResult
}

type TernaryOperator

type TernaryOperator int
const (
	TER_INVALID TernaryOperator = iota
	TER_SLICE                   // von bis
	TER_BETWEEN                 // zwischen
)

func (TernaryOperator) Operator

func (TernaryOperator) Operator()

func (TernaryOperator) String

func (op TernaryOperator) String() string

type TypeOpExpr

type TypeOpExpr struct {
	Range    token.Range
	Tok      token.Token
	Operator TypeOperator
	Rhs      ddptypes.Type
}

expressions that operate on types (Standardwert, Größe)

func (*TypeOpExpr) Accept

func (expr *TypeOpExpr) Accept(v FullVisitor) VisitResult

func (*TypeOpExpr) GetRange

func (expr *TypeOpExpr) GetRange() token.Range

func (*TypeOpExpr) String

func (expr *TypeOpExpr) String() string

func (*TypeOpExpr) Token

func (expr *TypeOpExpr) Token() token.Token

type TypeOpExprVisitor

type TypeOpExprVisitor interface {
	Visitor
	VisitTypeOpExpr(*TypeOpExpr) VisitResult
}

type TypeOperator

type TypeOperator int
const (
	TYPE_INVALID TypeOperator = iota
	TYPE_SIZE                 // Größe
	TYPE_DEFAULT              // Standardwert
)

func (TypeOperator) Operator

func (TypeOperator) Operator()

func (TypeOperator) String

func (op TypeOperator) String() string

type UnaryExpr

type UnaryExpr struct {
	Range    token.Range
	Tok      token.Token
	Operator UnaryOperator
	Rhs      Expression
}

Expressions

func (*UnaryExpr) Accept

func (expr *UnaryExpr) Accept(v FullVisitor) VisitResult

func (*UnaryExpr) GetRange

func (expr *UnaryExpr) GetRange() token.Range

func (*UnaryExpr) String

func (expr *UnaryExpr) String() string

func (*UnaryExpr) Token

func (expr *UnaryExpr) Token() token.Token

type UnaryExprVisitor

type UnaryExprVisitor interface {
	Visitor
	VisitUnaryExpr(*UnaryExpr) VisitResult
}

type UnaryOperator

type UnaryOperator int
const (
	UN_INVALID   UnaryOperator = iota
	UN_ABS                     // Betrag von
	UN_LEN                     // Länge von
	UN_NEGATE                  // -
	UN_NOT                     // nicht
	UN_LOGIC_NOT               // logisch nicht
)

func (UnaryOperator) Operator

func (UnaryOperator) Operator()

func (UnaryOperator) String

func (op UnaryOperator) String() string

type VarDecl

type VarDecl struct {
	Range      token.Range
	CommentTok *token.Token  // optional comment (also contained in ast.Comments)
	Type       ddptypes.Type // type of the variable
	NameTok    token.Token   // identifier name
	IsPublic   bool          // wether the function is marked with öffentliche
	Mod        *Module       // the module in which the variable was declared
	InitVal    Expression    // initial value
}

Declarations

func (*VarDecl) Accept

func (decl *VarDecl) Accept(visitor FullVisitor) VisitResult

func (*VarDecl) Comment

func (decl *VarDecl) Comment() *token.Token

func (*VarDecl) GetRange

func (decl *VarDecl) GetRange() token.Range

func (*VarDecl) Module

func (decl *VarDecl) Module() *Module

func (*VarDecl) Name

func (decl *VarDecl) Name() string

func (*VarDecl) Public

func (decl *VarDecl) Public() bool

func (*VarDecl) String

func (decl *VarDecl) String() string

func (*VarDecl) Token

func (decl *VarDecl) Token() token.Token

type VarDeclVisitor

type VarDeclVisitor interface {
	Visitor
	VisitVarDecl(*VarDecl) VisitResult
}

type VisitResult

type VisitResult uint8

result type of all Visitor methods

const (
	VisitRecurse      VisitResult = iota // visiting continues normally
	VisitSkipChildren                    // children of the node are not visited
	VisitBreak                           // visiting is stopped
)

type Visitor

type Visitor interface {
	Visitor() // dummy function for the interface
}

base interface for all visitors this interface itself is useless, implement one of the sub-interfaces for the actual functionality

type WhileStmt

type WhileStmt struct {
	Range     token.Range
	While     token.Token // solange, mache, mal
	Condition Expression
	Body      Statement
}

Statements

func (*WhileStmt) Accept

func (stmt *WhileStmt) Accept(v FullVisitor) VisitResult

func (*WhileStmt) GetRange

func (stmt *WhileStmt) GetRange() token.Range

func (*WhileStmt) String

func (stmt *WhileStmt) String() string

func (*WhileStmt) Token

func (stmt *WhileStmt) Token() token.Token

type WhileStmtVisitor

type WhileStmtVisitor interface {
	Visitor
	VisitWhileStmt(*WhileStmt) VisitResult
}

Directories

Path Synopsis
This file contains an example annotator that attaches metadata to Bad nodes The metadata is a simple counter that is attached to each Bad node
This file contains an example annotator that attaches metadata to Bad nodes The metadata is a simple counter that is attached to each Bad node

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL