Documentation
¶
Index ¶
- Constants
- Variables
- func GetParameterName(functionName string, paramIndex int) string
- func ParseNumber(s string) (float64, error)
- type AxisExpression
- type BlockStatement
- type BracketExpression
- type CallExpression
- type CommandStatement
- type Expression
- type ExpressionStatement
- type FunctionDeclaration
- type FunctionSignature
- type Identifier
- type IfStatement
- type InfixExpression
- type KeywordExpression
- type Lexer
- type Node
- type NumberLiteral
- type Parser
- type PieceDeclaration
- type PrefixExpression
- type Preprocessor
- type Program
- type ReturnStatement
- type Statement
- type StaticVarDeclaration
- type StringLiteral
- type Token
- type TokenType
- type WhileStatement
Constants ¶
const ( LOWEST int ASSIGN // = OR // || AND // && EQUALS // == or != LESSGREATER // > or < BITWISE // | & SUM // + or - PRODUCT // * / % PREFIX // -x or !x CALL // func() )
Parser precedence levels
Variables ¶
var WellKnownFunctions = map[string]FunctionSignature{ "AimPrimary": { Name: "AimPrimary", ParamNames: []string{"heading", "pitch"}, }, "AimSecondary": { Name: "AimSecondary", ParamNames: []string{"heading", "pitch"}, }, "AimTertiary": { Name: "AimTertiary", ParamNames: []string{"heading", "pitch"}, }, "AimFromPrimary": { Name: "AimFromPrimary", ParamNames: []string{"piecenum"}, }, "AimFromSecondary": { Name: "AimFromSecondary", ParamNames: []string{"piecenum"}, }, "AimFromTertiary": { Name: "AimFromTertiary", ParamNames: []string{"piecenum"}, }, "QueryPrimary": { Name: "QueryPrimary", ParamNames: []string{"piecenum"}, }, "QuerySecondary": { Name: "QuerySecondary", ParamNames: []string{"piecenum"}, }, "QueryTertiary": { Name: "QueryTertiary", ParamNames: []string{"piecenum"}, }, "SweetSpot": { Name: "SweetSpot", ParamNames: []string{"piecenum"}, }, "Killed": { Name: "Killed", ParamNames: []string{"severity", "corpsetype", "damagetype"}, }, "HitByWeapon": { Name: "HitByWeapon", ParamNames: []string{"anglex", "anglez"}, }, "HitByWeaponId": { Name: "HitByWeaponId", ParamNames: []string{"anglex", "anglez", "weaponid", "dmg"}, }, "StartMoving": { Name: "StartMoving", ParamNames: []string{"reversing"}, }, "MoveRate": { Name: "MoveRate", ParamNames: []string{"rate"}, }, "SetSpeed": { Name: "SetSpeed", ParamNames: []string{"speed"}, }, "SetDirection": { Name: "SetDirection", ParamNames: []string{"heading"}, }, "StartBuilding": { Name: "StartBuilding", ParamNames: []string{"heading", "pitch"}, }, "QueryBuildInfo": { Name: "QueryBuildInfo", ParamNames: []string{"piecenum"}, }, "QueryNanoPiece": { Name: "QueryNanoPiece", ParamNames: []string{"piecenum"}, }, "QueryTransport": { Name: "QueryTransport", ParamNames: []string{"piecenum"}, }, "BeginTransport": { Name: "BeginTransport", ParamNames: []string{"unitid"}, }, "TransportPickup": { Name: "TransportPickup", ParamNames: []string{"unitid"}, }, "TransportDrop": { Name: "TransportDrop", ParamNames: []string{"unitid", "position"}, }, "smokeunit": { Name: "smokeunit", ParamNames: []string{"healthpercent", "sleeptime", "smoketype"}, }, "smokecontrol": { Name: "smokecontrol", ParamNames: []string{"healthpercent", "smoketype", "sleeptime"}, }, "rockunit": { Name: "rockunit", ParamNames: []string{"anglex", "anglez"}, }, "motioncontrol": { Name: "motioncontrol", ParamNames: []string{"moving", "aiming", "justmoved"}, }, "attack1": { Name: "attack1", ParamNames: []string{"weapon"}, }, "attack2": { Name: "attack2", ParamNames: []string{"weapon"}, }, "attack3": { Name: "attack3", ParamNames: []string{"weapon"}, }, "attack4": { Name: "attack4", ParamNames: []string{"weapon"}, }, "turndirection": { Name: "turndirection", ParamNames: []string{"dir"}, }, "setmaxreloadtime": { Name: "setmaxreloadtime", ParamNames: []string{"time"}, }, "aimweapon": { Name: "aimweapon", ParamNames: []string{"heading", "pitch", "weaponnum"}, }, "fireweapon": { Name: "fireweapon", ParamNames: []string{"weaponnum"}, }, "targetcleared": { Name: "targetcleared", ParamNames: []string{"weaponnum"}, }, "queryweapon": { Name: "queryweapon", ParamNames: []string{"piecenum", "weaponnum"}, }, "queryblood": { Name: "queryblood", ParamNames: []string{"piecenum"}, }, "dying": { Name: "dying", ParamNames: []string{"damagetype"}, }, "setSFXoccupy": { Name: "setSFXoccupy", ParamNames: []string{"state"}, }, "windchange": { Name: "windchange", ParamNames: []string{"windspeed", "winddirection"}, }, "hitbyweapon": { Name: "hitbyweapon", ParamNames: []string{"attacker", "pitch", "roll", "severity"}, }, "moverate": { Name: "moverate", ParamNames: []string{"rate"}, }, "RequestState": { Name: "RequestState", ParamNames: []string{"requestedstate", "currentstate"}, }, "TriggerHit": { Name: "TriggerHit", ParamNames: []string{"Trigger_ID", "unitID", "Var_3"}, }, "UnitDestroyed": { Name: "UnitDestroyed", ParamNames: []string{"unitID"}, }, }
WellKnownFunctions contains signatures for standard TA BOS functions plus TA: Kingdoms additions taken from Scriptor's [COMMON_FUNC] table. Entries register the widest known signature; the decompiler caps the rendered parameter count by the script's STACK_ALLOC count, so TA scripts using a narrower variant of a shared function (e.g. 2-arg Killed) still render correctly.
This map is easily extensible - just add new entries for additional functions
Functions ¶
func GetParameterName ¶
GetParameterName returns the proper name for a parameter at the given index, or returns the default "local_N" name if no signature is defined
func ParseNumber ¶
ParseNumber attempts to parse a number from a string
Types ¶
type AxisExpression ¶
AxisExpression represents axis keywords: x-axis, y-axis, z-axis
func (*AxisExpression) String ¶
func (ae *AxisExpression) String() string
func (*AxisExpression) TokenLiteral ¶
func (ae *AxisExpression) TokenLiteral() string
type BlockStatement ¶
BlockStatement represents { ... }
func (*BlockStatement) String ¶
func (bs *BlockStatement) String() string
func (*BlockStatement) TokenLiteral ¶
func (bs *BlockStatement) TokenLiteral() string
type BracketExpression ¶
type BracketExpression struct {
Token Token // [ or <
Expression Expression
BracketType string // "[]" or "<>"
}
BracketExpression represents [expr] or <expr>
func (*BracketExpression) String ¶
func (be *BracketExpression) String() string
func (*BracketExpression) TokenLiteral ¶
func (be *BracketExpression) TokenLiteral() string
type CallExpression ¶
type CallExpression struct {
Token Token // function name or (
Function Expression
Arguments []Expression
}
CallExpression represents function calls: func(arg1, arg2)
func (*CallExpression) String ¶
func (ce *CallExpression) String() string
func (*CallExpression) TokenLiteral ¶
func (ce *CallExpression) TokenLiteral() string
type CommandStatement ¶
type CommandStatement struct {
Token Token // command token
Command string
Args []Expression
}
CommandStatement represents BOS commands (move, turn, show, etc.)
func (*CommandStatement) String ¶
func (cs *CommandStatement) String() string
func (*CommandStatement) TokenLiteral ¶
func (cs *CommandStatement) TokenLiteral() string
type Expression ¶
type Expression interface {
Node
// contains filtered or unexported methods
}
Expression represents an expression node
type ExpressionStatement ¶
type ExpressionStatement struct {
Token Token
Expression Expression
}
ExpressionStatement wraps an expression as a statement
func (*ExpressionStatement) String ¶
func (es *ExpressionStatement) String() string
func (*ExpressionStatement) TokenLiteral ¶
func (es *ExpressionStatement) TokenLiteral() string
type FunctionDeclaration ¶
type FunctionDeclaration struct {
Token Token // function name token
Name string
Parameters []string
Body *BlockStatement
}
FunctionDeclaration represents a function definition
func (*FunctionDeclaration) String ¶
func (fd *FunctionDeclaration) String() string
func (*FunctionDeclaration) TokenLiteral ¶
func (fd *FunctionDeclaration) TokenLiteral() string
type FunctionSignature ¶
type FunctionSignature struct {
Name string // Function name (e.g., "AimPrimary")
ParamNames []string // Parameter names in order (e.g., ["heading", "pitch"])
}
FunctionSignature defines the expected parameters for a well-known BOS function
func GetFunctionSignature ¶
func GetFunctionSignature(name string) *FunctionSignature
GetFunctionSignature returns the signature for a well-known function, or nil if not found
type Identifier ¶
Identifier represents a variable or piece name
func (*Identifier) String ¶
func (i *Identifier) String() string
func (*Identifier) TokenLiteral ¶
func (i *Identifier) TokenLiteral() string
type IfStatement ¶
type IfStatement struct {
Token Token // TOKEN_IF
Condition Expression
Consequence *BlockStatement
Alternative *BlockStatement
}
IfStatement represents: if (condition) { ... } else { ... }
func (*IfStatement) String ¶
func (is *IfStatement) String() string
func (*IfStatement) TokenLiteral ¶
func (is *IfStatement) TokenLiteral() string
type InfixExpression ¶
type InfixExpression struct {
Token Token
Left Expression
Operator string
Right Expression
}
InfixExpression represents binary operations: x + y, x == y, etc.
func (*InfixExpression) String ¶
func (ie *InfixExpression) String() string
func (*InfixExpression) TokenLiteral ¶
func (ie *InfixExpression) TokenLiteral() string
type KeywordExpression ¶
KeywordExpression represents special keywords as expressions
func (*KeywordExpression) String ¶
func (ke *KeywordExpression) String() string
func (*KeywordExpression) TokenLiteral ¶
func (ke *KeywordExpression) TokenLiteral() string
type Lexer ¶
type Lexer struct {
// contains filtered or unexported fields
}
Lexer tokenizes BOS source code
type NumberLiteral ¶
NumberLiteral represents a numeric value
func (*NumberLiteral) String ¶
func (nl *NumberLiteral) String() string
func (*NumberLiteral) TokenLiteral ¶
func (nl *NumberLiteral) TokenLiteral() string
type Parser ¶
type Parser struct {
// contains filtered or unexported fields
}
Parser parses BOS source into an AST
func (*Parser) ParseProgram ¶
ParseProgram parses the entire program
type PieceDeclaration ¶
PieceDeclaration represents: piece base, turret, barrel;
func (*PieceDeclaration) String ¶
func (pd *PieceDeclaration) String() string
func (*PieceDeclaration) TokenLiteral ¶
func (pd *PieceDeclaration) TokenLiteral() string
type PrefixExpression ¶
type PrefixExpression struct {
Token Token
Operator string
Right Expression
}
PrefixExpression represents unary operations: -x, !x
func (*PrefixExpression) String ¶
func (pe *PrefixExpression) String() string
func (*PrefixExpression) TokenLiteral ¶
func (pe *PrefixExpression) TokenLiteral() string
type Preprocessor ¶
type Preprocessor struct {
// contains filtered or unexported fields
}
Preprocessor handles BOS file preprocessing (#include, #define, #ifdef, etc.)
func NewPreprocessor ¶
func NewPreprocessor(fs filesystem.FileSystem, includePaths ...string) *Preprocessor
NewPreprocessor creates a new preprocessor with a filesystem
func (*Preprocessor) Process ¶
func (p *Preprocessor) Process(path string) (string, error)
Process processes a BOS file and returns the expanded source
func (*Preprocessor) ProcessContent ¶
func (p *Preprocessor) ProcessContent(content, baseDir string) (string, error)
ProcessContent preprocesses raw source content (as opposed to Process which reads from a file).
type Program ¶
type Program struct {
Statements []Statement
}
Program is the root node of the AST
func (*Program) TokenLiteral ¶
type ReturnStatement ¶
type ReturnStatement struct {
Token Token // TOKEN_RETURN
ReturnValue Expression
}
ReturnStatement represents: return (expr);
func (*ReturnStatement) String ¶
func (rs *ReturnStatement) String() string
func (*ReturnStatement) TokenLiteral ¶
func (rs *ReturnStatement) TokenLiteral() string
type Statement ¶
type Statement interface {
Node
// contains filtered or unexported methods
}
Statement represents a statement node
type StaticVarDeclaration ¶
StaticVarDeclaration represents: static-var x, y, z;
func (*StaticVarDeclaration) String ¶
func (sv *StaticVarDeclaration) String() string
func (*StaticVarDeclaration) TokenLiteral ¶
func (sv *StaticVarDeclaration) TokenLiteral() string
type StringLiteral ¶
StringLiteral represents a string value
func (*StringLiteral) String ¶
func (sl *StringLiteral) String() string
func (*StringLiteral) TokenLiteral ¶
func (sl *StringLiteral) TokenLiteral() string
type Token ¶
Token represents a lexical token
func TokensNoWS ¶
TokensNoWS returns all non-whitespace tokens
type TokenType ¶
type TokenType int
TokenType represents the type of a token
const ( // Special tokens TOKEN_EOF TokenType = iota TOKEN_ILLEGAL TOKEN_COMMENT TOKEN_WHITESPACE TOKEN_NEWLINE // Literals TOKEN_IDENT // identifier, piece name, variable TOKEN_NUMBER // 123, -456 TOKEN_STRING // "string" // Keywords TOKEN_PIECE TOKEN_STATIC_VAR TOKEN_WHILE TOKEN_IF TOKEN_ELSE TOKEN_RETURN TOKEN_VAR // Commands (case-insensitive in BOS) TOKEN_MOVE TOKEN_TURN TOKEN_SPIN TOKEN_STOP_SPIN TOKEN_SHOW TOKEN_HIDE TOKEN_CACHE TOKEN_DONT_CACHE TOKEN_SHADE TOKEN_DONT_SHADE TOKEN_EMIT_SFX TOKEN_EXPLODE TOKEN_SLEEP TOKEN_WAIT_FOR_TURN TOKEN_WAIT_FOR_MOVE TOKEN_CALL_SCRIPT TOKEN_START_SCRIPT TOKEN_SIGNAL TOKEN_SET_SIGNAL_MASK TOKEN_GET TOKEN_SET TOKEN_RAND TOKEN_ATTACH_UNIT TOKEN_DROP_UNIT // Keywords for commands TOKEN_TO TOKEN_ALONG TOKEN_AROUND TOKEN_SPEED TOKEN_NOW TOKEN_ACCELERATE TOKEN_DECELERATE TOKEN_FROM TOKEN_TYPE // Axes TOKEN_X_AXIS TOKEN_Y_AXIS TOKEN_Z_AXIS // Operators TOKEN_ASSIGN // = TOKEN_PLUS // + TOKEN_MINUS // - TOKEN_STAR // * TOKEN_SLASH // / TOKEN_PERCENT // % TOKEN_PIPE // | TOKEN_AMP // & TOKEN_LT // < TOKEN_GT // > TOKEN_LE // <= TOKEN_GE // >= TOKEN_EQ // == TOKEN_NE // != TOKEN_NOT // ! TOKEN_AND // && TOKEN_OR // || // Delimiters TOKEN_LPAREN // ( TOKEN_RPAREN // ) TOKEN_LBRACE // { TOKEN_RBRACE // } TOKEN_LBRACKET // [ TOKEN_RBRACKET // ] TOKEN_COMMA // , TOKEN_SEMICOLON // ; )
func LookupIdent ¶
LookupIdent checks if an identifier is a keyword
type WhileStatement ¶
type WhileStatement struct {
Token Token // TOKEN_WHILE
Condition Expression
Body *BlockStatement
}
WhileStatement represents: while (condition) { ... }
func (*WhileStatement) String ¶
func (ws *WhileStatement) String() string
func (*WhileStatement) TokenLiteral ¶
func (ws *WhileStatement) TokenLiteral() string