walt-compiler
Version:
Alternative syntax for WebAssembly text format
72 lines (66 loc) • 2.47 kB
JavaScript
/**
* This module contains all the general purpose mappings of Node Type to
* generator functions.
*
* @flow
*/
import generateFunctionCall from './function-call';
import generateIndirectFunctionCall from './indirect-function-call';
import generateBinaryExpression from './binary-expression';
import generateTernary from './ternary-expression';
import generateIf from './if-then-else';
import generateFunctionPointer from './function-pointer';
import generateReturn from './return-statement';
import generateDeclaration from './declaration';
import generateAssignment from './assignment';
import generateAssignmentExpression from './assignment-expression';
import generateLoop from './loop';
import generateTypecast from './typecast';
import generateBreak from './break';
import generateNoop from './noop';
import generateBlock from './block';
import generateElse from './else';
import generateSelect from './select';
import generateNative from './native';
import generateConstant from './constant';
import Syntax from 'walt-syntax';
import { getInScope } from './utils';
import curry from 'curry';
import invariant from 'invariant';
import type { MapSyntaxType, GeneratorType } from './flow/types';
export const syntaxMap: { [string]: GeneratorType } = {
[]: generateFunctionCall,
[]: generateIndirectFunctionCall,
// Unary
[]: generateConstant,
[]: generateBinaryExpression,
[]: generateTernary,
[]: generateIf,
[]: generateElse,
[]: generateSelect,
[]: generateBlock,
[]: getInScope,
[]: getInScope,
[]: generateFunctionPointer,
[]: generateReturn,
// Binary
[]: generateDeclaration,
[]: generateAssignment,
[]: generateAssignmentExpression,
// Loops
[]: generateLoop,
[]: generateBreak,
// Typecast
[]: generateTypecast,
[]: generateNoop,
[]: generateNative,
};
const mapSyntax: MapSyntaxType = curry((parent, operand) => {
const mapping = syntaxMap[operand.Type];
invariant(
mapping,
`Unsupported Syntax Token. ${operand.Type} "${operand.value}"`
);
return mapping(operand, parent);
});
export default mapSyntax;