walt-compiler
Version:
Alternative syntax for WebAssembly text format
151 lines (135 loc) • 3.14 kB
JavaScript
// @flow
/* global $Exact */
export type Marker = {
sourceLine: string,
line: number,
col: number,
};
export type TokenType = {
start: Marker,
end: Marker,
type: string,
value: string,
};
export type MetadataType = { [string]: any };
export type NodeType = {
range: Marker[],
Type: string,
type: string | null,
value: string,
meta: MetadataType,
params: NodeType[],
};
// Grammar Nodes
type BaseNode = {
range: Marker[],
type: string | null,
value: string,
meta: MetadataType,
};
export type Identifier = BaseNode & {
Type: 'Identifier',
params: [],
};
export type Type = BaseNode & {
Type: 'Type',
params: [],
};
export type Constant = BaseNode & {
Type: 'Constant',
params: [],
};
export type IdentifierTypePair = BaseNode & {
Type: 'Pair',
params: [Identifier, Type],
};
export type BlockStatement = NodeType;
export type DefaultArgument = BaseNode & {
Type: 'Assignment',
params: [IdentifierTypePair, Constant],
};
export type FunctionArgument = IdentifierTypePair | DefaultArgument;
export type FunctionArguments = BaseNode & {
Type: 'FunctionArguments',
params: FunctionArgument[],
};
export type FunctionResult = BaseNode & {
Type: 'FunctionResult',
params: Type[],
};
export type Block = BaseNode & {
Type: 'Block',
params: BlockStatement[],
};
export type FunctionDeclaration = BaseNode & {
Type: 'FunctionDeclaration',
params: [FunctionArguments, FunctionResult, Block],
};
export type WebAssemblyModuleType = {
instance: {
exports: {
[string]: any,
},
},
};
export type NodeMap = { [string]: NodeType };
// Semantics
export type SemanticOptions = {
parser: string => NodeType,
stmt: any => NodeType,
};
export type Context = {
functions: { [string]: FunctionDeclaration },
types: NodeMap,
userTypes: NodeMap,
table: NodeMap,
hoist: NodeType[],
statics: { [string]: null },
scopes: NodeMap[],
memories: NodeType[],
tables: NodeType[],
aliases: { [string]: string },
exports: { [string]: NodeType },
};
export type Transform = ([NodeType, Context]) => NodeType;
export type NodeParser = NodeParser => (
[NodeType, Context],
Transform
) => NodeType;
export type Semantics = {
[string]: (Transform) => ([NodeType, Context], Transform) => NodeType,
};
export type SemanticsFactory = SemanticOptions => Semantics;
export type SemanticPlugin = { semantics: SemanticsFactory };
// Grammar
export type Grammar = {
ParserRules: mixed[],
};
export type GrammarFactory = () => Grammar;
export type GrammarPlugin = { grammar: GrammarFactory };
export type BaseOptions = {
version: number,
encodeNames: boolean,
lines: string[],
filename: string,
};
export type Plugin = {
grammar?: () => any,
semantics: SemanticOptions => Semantics,
};
export type ConfigType = BaseOptions & {
linker?: {
statics: { [string]: number },
},
extensions: Array<(BaseOptions) => Plugin>,
};
export type GeneratorOptions = BaseOptions & {
linker?: {
statics: { [string]: number },
},
};
export type TypeCastType = {
...$Exact<NodeType>,
type: string,
params: [{ ...NodeType, type: string }],
};