Documentation
¶
Index ¶
- func IsExternFunc(fun *FuncDecl) bool
- func IterateImportedDecls(imprt *ImportStmt, ...)
- func IterateModuleImports(module *Module, fun func(*Module))
- func TrimStringLit(lit *token.Token) string
- func VisitAst(ast *Ast, visitor BaseVisitor)
- func VisitModuleRec(module *Module, visitor BaseVisitor)
- func VisitNode(visitor BaseVisitor, node Node, currentScope *SymbolTable)
- func WalkAst(ast *Ast, visitor FullVisitor)
- type AssignStmt
- type AssignStmtVisitor
- type Assigneable
- type Ast
- type BadDecl
- type BadDeclVisitor
- type BadExpr
- type BadExprVisitor
- type BadStmt
- type BadStmtVisitor
- type BaseVisitor
- type BinaryExpr
- type BinaryExprVisitor
- type BinaryOperator
- type BlockStmt
- type BlockStmtVisitor
- type BoolLit
- type BoolLitVisitor
- type CastExpr
- type CastExprVisitor
- type CharLit
- type CharLitVisitor
- type ConditionalVisitor
- type DeclStmt
- type DeclStmtVisitor
- type Declaration
- type ExprStmt
- type ExprStmtVisitor
- type Expression
- type FloatLit
- type FloatLitVisitor
- type ForRangeStmt
- type ForRangeStmtVisitor
- type ForStmt
- type ForStmtVisitor
- type FullVisitor
- type FuncAlias
- type FuncCall
- type FuncCallVisitor
- type FuncDecl
- type FuncDeclVisitor
- type Grouping
- type GroupingVisitor
- type Ident
- type IdentVisitor
- type IfStmt
- type IfStmtVisitor
- type ImportStmt
- type ImportStmtVisitor
- type Indexing
- type IndexingVisitor
- type IntLit
- type IntLitVisitor
- type ListLit
- type ListLitVisitor
- type Module
- type Node
- type Operator
- type ReturnStmt
- type ReturnStmtVisitor
- type ScopeVisitor
- type Statement
- type StringLit
- type StringLitVisitor
- type SymbolTable
- type TernaryExpr
- type TernaryExprVisitor
- type TernaryOperator
- type UnaryExpr
- type UnaryExprVisitor
- type UnaryOperator
- type VarDecl
- type VarDeclVisitor
- type WhileStmt
- type WhileStmtVisitor
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsExternFunc ¶
check if the function is defined externally
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 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 ¶
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 VisitAst ¶
func VisitAst(ast *Ast, visitor BaseVisitor)
invokes visitor on each Node of ast while checking if visitor implements other *Visitor-Interfaces and invoking them accordingly
func VisitModuleRec ¶
func VisitModuleRec(module *Module, visitor BaseVisitor)
calls VisitAst on all Asts of module and it's imports
func VisitNode ¶
func VisitNode(visitor BaseVisitor, node Node, currentScope *SymbolTable)
invokes visitor on each Node of ast while checking if visitor implements other *Visitor-Interfaces and invoking them accordingly a optional SymbolTable may be passed if neccessery
func WalkAst ¶
func WalkAst(ast *Ast, visitor FullVisitor)
invoke the Visitor for each top level statement in the Ast
Types ¶
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)
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 {
BaseVisitor
VisitAssignStmt(*AssignStmt)
}
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)
}
represents an Abstract Syntax Tree for a token.DDP program
type BadDecl ¶
an invalid Declaration
func (*BadDecl) Accept ¶
func (decl *BadDecl) Accept(visitor FullVisitor)
type BadDeclVisitor ¶
type BadDeclVisitor interface {
BaseVisitor
VisitBadDecl(*BadDecl)
}
type BadExprVisitor ¶
type BadExprVisitor interface {
BaseVisitor
VisitBadExpr(*BadExpr)
}
type BadStmtVisitor ¶
type BadStmtVisitor interface {
BaseVisitor
VisitBadStmt(*BadStmt)
}
type BaseVisitor ¶
type BaseVisitor interface {
BaseVisitor() // dummy function for the interface
}
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)
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 {
BaseVisitor
VisitBinaryExpr(*BinaryExpr)
}
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 )
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)
type BlockStmtVisitor ¶
type BlockStmtVisitor interface {
BaseVisitor
VisitBlockStmt(*BlockStmt)
}
type BoolLitVisitor ¶
type BoolLitVisitor interface {
BaseVisitor
VisitBoolLit(*BoolLit)
}
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)
type CastExprVisitor ¶
type CastExprVisitor interface {
BaseVisitor
VisitCastExpr(*CastExpr)
}
type CharLitVisitor ¶
type CharLitVisitor interface {
BaseVisitor
VisitCharLit(*CharLit)
}
type ConditionalVisitor ¶
type DeclStmt ¶
type DeclStmt struct {
Decl Declaration
}
Statements
func (*DeclStmt) Accept ¶
func (stmt *DeclStmt) Accept(v FullVisitor)
type DeclStmtVisitor ¶
type DeclStmtVisitor interface {
BaseVisitor
VisitDeclStmt(*DeclStmt)
}
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
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)
type ExprStmtVisitor ¶
type ExprStmtVisitor interface {
BaseVisitor
VisitExprStmt(*ExprStmt)
}
type Expression ¶
type Expression interface {
Node
// contains filtered or unexported methods
}
basic Node interfaces
type FloatLitVisitor ¶
type FloatLitVisitor interface {
BaseVisitor
VisitFloatLit(*FloatLit)
}
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)
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 {
BaseVisitor
VisitForRangeStmt(*ForRangeStmt)
}
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)
type ForStmtVisitor ¶
type ForStmtVisitor interface {
BaseVisitor
VisitForStmt(*ForStmt)
}
type FullVisitor ¶
type FullVisitor interface {
BaseVisitor
BadDeclVisitor
VarDeclVisitor
FuncDeclVisitor
BadExprVisitor
IdentVisitor
IndexingVisitor
IntLitVisitor
FloatLitVisitor
BoolLitVisitor
CharLitVisitor
StringLitVisitor
ListLitVisitor
UnaryExprVisitor
BinaryExprVisitor
TernaryExprVisitor
CastExprVisitor
GroupingVisitor
FuncCallVisitor
BadStmtVisitor
DeclStmtVisitor
ExprStmtVisitor
ImportStmtVisitor
AssignStmtVisitor
BlockStmtVisitor
IfStmtVisitor
WhileStmtVisitor
ForStmtVisitor
ForRangeStmtVisitor
ReturnStmtVisitor
}
interface for visiting DDP expressions, statements and declarations see the Visitor pattern
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 an alias
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)
type FuncCallVisitor ¶
type FuncCallVisitor interface {
BaseVisitor
VisitFuncCall(*FuncCall)
}
type FuncDecl ¶
type FuncDecl struct {
Range token.Range
Comment *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 // 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)
type FuncDeclVisitor ¶
type FuncDeclVisitor interface {
BaseVisitor
VisitFuncDecl(*FuncDecl)
}
type Grouping ¶
type Grouping struct {
Range token.Range
LParen token.Token // (
Expr Expression
}
Expressions
func (*Grouping) Accept ¶
func (expr *Grouping) Accept(v FullVisitor)
type GroupingVisitor ¶
type GroupingVisitor interface {
BaseVisitor
VisitGrouping(*Grouping)
}
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)
type IdentVisitor ¶
type IdentVisitor interface {
BaseVisitor
VisitIdent(*Ident)
}
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)
type IfStmtVisitor ¶
type IfStmtVisitor interface {
BaseVisitor
VisitIfStmt(*IfStmt)
}
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)
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 {
BaseVisitor
VisitImportStmt(*ImportStmt)
}
type Indexing ¶
type Indexing struct {
Lhs Assigneable // variable Name
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)
type IndexingVisitor ¶
type IndexingVisitor interface {
BaseVisitor
VisitIndexing(*Indexing)
}
type IntLitVisitor ¶
type IntLitVisitor interface {
BaseVisitor
VisitIntLit(*IntLit)
}
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.Type
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)
type ListLitVisitor ¶
type ListLitVisitor interface {
BaseVisitor
VisitListLit(*ListLit)
}
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 and variables
PublicDecls map[string]Declaration
}
represents a single DDP Module (source file), it's dependencies and public interface
func (*Module) GetIncludeFilename ¶
returns the string-literal content by which this module was first imported or the short FileName if it is the main module
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)
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 {
BaseVisitor
VisitReturnStmt(*ReturnStmt)
}
type ScopeVisitor ¶
type ScopeVisitor interface {
UpdateScope(*SymbolTable)
}
type Statement ¶
type Statement interface {
Node
// contains filtered or unexported methods
}
basic Node interfaces
type StringLit ¶
Expressions
func (*StringLit) Accept ¶
func (expr *StringLit) Accept(v FullVisitor)
type StringLitVisitor ¶
type StringLitVisitor interface {
BaseVisitor
VisitStringLit(*StringLit)
}
type SymbolTable ¶
type SymbolTable struct {
Enclosing *SymbolTable // enclosing scope (nil in the global scope)
Declarations map[string]Declaration // map of all variables and functions
}
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)
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 {
BaseVisitor
VisitTernaryExpr(*TernaryExpr)
}
type TernaryOperator ¶
type TernaryOperator int
const ( TER_INVALID TernaryOperator = iota TER_SLICE // von bis )
func (TernaryOperator) Operator ¶
func (TernaryOperator) Operator()
func (TernaryOperator) String ¶
func (op TernaryOperator) 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)
type UnaryExprVisitor ¶
type UnaryExprVisitor interface {
BaseVisitor
VisitUnaryExpr(*UnaryExpr)
}
type UnaryOperator ¶
type UnaryOperator int
const ( UN_INVALID UnaryOperator = iota UN_ABS // Betrag von UN_LEN // Länge von UN_SIZE // Größe 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
Comment *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
// wether the variable was declared in the global scope
// used pretty much only in the compiler
IsGlobal bool
Mod *Module // the module in which the variable was declared
InitVal Expression // initial value
}
Declarations
func (*VarDecl) Accept ¶
func (decl *VarDecl) Accept(visitor FullVisitor)
type VarDeclVisitor ¶
type VarDeclVisitor interface {
BaseVisitor
VisitVarDecl(*VarDecl)
}
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)
type WhileStmtVisitor ¶
type WhileStmtVisitor interface {
BaseVisitor
VisitWhileStmt(*WhileStmt)
}
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
The resolver package should not be used independently from the parser.
|
The resolver package should not be used independently from the parser. |