ForgeTypes

Includes:

Introduction

This header defines the C data types a host application needs to register its own syntax with the Forge parser, and to use the Forge parser to generate Leonie bytecode.



Typedefs

THostParameterOptional
THostParameterType

THostParameterOptional


typedef enum { 
    EHostParameterOptional = 1, 
    EHostParameterRequired = 0 
} THostParameterOptional;  
Discussion

The THostParameterOptional enum is used by THostCommandEntry to indicate whether a part of a command is required or optional.


THostParameterType


typedef enum { 
    EHostParamImmediateValue = 0,
    EHostParamExpression,
    EHostParamContainer,
    EHostParamIdentifier,
    EHostParamInvisibleIdentifier,
    EHostParamLabeledValue,
    EHostParamLabeledExpression,
    EHostParamLabeledContainer,
    EHostParamExpressionOrIdentifiersTillLineEnd,
    EHostParam_Sentinel 
} THostParameterType;  
Constants
EHostParamExpression

An entire expression, but no label.

EHostParamContainer

A container that something can be put into.

EHostParamIdentifier

An identifier that gets passed as a string.

EHostParamInvisibleIdentifier

An identifier that is simply used to switch modes, but doesn't cause a parameter.

EHostParamLabeledValue

A value preceded by an identifier labeling it.

EHostParamLabeledExpression

An expression preceded by an identifier labeling it.

EHostParamLabeledContainer

A container that something can be put into, preceded by an identifier labeling it.

EHostParamExpressionOrIdentifiersTillLineEnd

Either an expression, or a bunch of unquoted string literals all merged into one string parameter with a single space separating each from the next. Used e.g. for 'play' command's melody.

EHostParam_Sentinel

If this value is specified, this is the last parameter.

Constants
EHostParamImmediateValue

Just a value.

Discussion

The THostParameterType enum is used by THostCommandEntry to indicate which part of a command is to be parsed in what way.


Structs and Unions

THostParameterEntry

THostParameterEntry


struct THostParameterEntry { 
    THostParameterType mType;
    TIdentifierSubtype mIdentifierType;
    THostParameterOptional mIsOptional;
    LEOInstructionID mInstructionID;
    uint16_t mInstructionParam1;
    uint32_t mInstructionParam2;
    char mModeRequired;
    char mModeToSet;
};  
Fields
mType

The type of parameter to parse, or EHostParam_Sentinel if this is the end of the list of host command entries.

mIdentifierType

The identifier (for the label or identifier, depending on mType).

mIsOptional

Is this parameter required or optional? If not present and optional, we, pass an empty string unless mType indicates otherwise, or mInstructionID is not INVALID_INSTR2.

mInstructionID

If not INVALID_INSTR2, this instruction overrides the one in the command entry if this parameter is present. If mType is EHostParamIdentifier, no string will be passed as a parameter either.

mInstructionParam1

If mInstructionID is not INVALID_INSTR2, these parameters will be assigned to the instruction if this parameter is parsed.

mInstructionParam2

If mInstructionID is not INVALID_INSTR2, these parameters will be assigned to the instruction if this parameter is parsed.

mModeRequired

If this isn't 0, only parse this if the current mode is this number. The mode can be used to group together certain parameters so they only match when a previous parameter matched.

mModeToSet

If this parameter matches, and this isn't 0, change the current mode to this. The mode can be used to only look for certain parameters when a previous parameter matched.

Discussion

An entry for a parameter to a THostCommandEntry in our host command look-up table:


Macro Definitions

X1

X1


#define X1(constName,constStr) X2(constName,constName,constStr) 
Discussion

The various built-in identifiers the parser recognizes: Adding an identifier here defines the identifier type enum for it, as well as the matching string table entry (which must be all-lowercase so our fake case-insensitivity will work). Also, if you use the X2 macro instead of X1, you can also declare a token as synonymous to another token, e.g. to register a short form that is always remapped to the longer form before the parser sees it.

If you want to use any identifiers for your host-specific commands that aren't in here, you must currently edit this file to add them. In the future, you will hopefully be able to just define your own identifiers elsewhere in addition to the ones here that are needed for built-in commands.