NodeKind.java

package org.sterling.source.syntax;

public enum NodeKind {

    UNDEFINED,
    ANYTHING,
    INTEGER,
    IDENTIFIER,
    STRING,
    DOUBLE,
    CHARACTER,
    BOOLEAN,
    NOTHING,
    ADD,
    SUBTRACT,
    MULTIPLY,
    DIVIDE,
    MODULO,
    POSITIVE,
    NEGATIVE,
    SHIFT_LEFT,
    SHIFT_RIGHT,
    SIGNED_SHIFT_RIGHT,
    COALESCE,
    BITWISE_AND,
    BITWISE_OR,
    BITWISE_XOR,
    BITWISE_NOT,
    LOGICAL_AND,
    LOGICAL_OR,
    LOGICAL_NOT,
    GREATER_THAN,
    LESS_THAN,
    GREATER_THAN_EQUALS,
    LESS_THAN_EQUALS,
    EQUALS,
    NOT_EQUALS,
    ASSIGN,
    TERNARY_TRUE,
    TERNARY_FALSE,
    GROUP_OPEN,
    GROUP_CLOSE,
    INDEXER_OPEN,
    INDEXER_CLOSE,
    ACCESSOR,
    BLOCK_OPEN,
    BLOCK_CLOSE,
    TERMINATOR,
    END_OF_INPUT,
    ARROW,
    KEYWORD_OBJECT,
    KEYWORD_POSITIVE,
    KEYWORD_NEGATIVE,
    INDEXER_OPERATOR,
    SEPARATOR,
    KEYWORD_IF,
    APPLY,
    KEYWORD_MODULE,
    KEYWORD_IMPORT,
    WILDCARD,
    KEYWORD_FROM,
    KEYWORD_AS,
    KEYWORD_JAVA,

    ACCESSOR_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new AccessorExpression(this);
        }
    },

    ARGUMENT(false) {
        @Override
        public SourceNode createNode() {
            return new ArgumentExpression(this);
        }
    },

    ARGUMENTS_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new ArgumentsExpression(this);
        }
    },

    ARGUMENTS_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new ArgumentsExpressionTail(this);
        }
    },

    BOOLEAN_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new BooleanLiteral(this);
        }
    },

    CHARACTER_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new CharacterLiteral(this);
        }
    },

    EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new SourceExpression(this);
        }
    },

    DOUBLE_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new DoubleLiteral(this);
        }
    },

    INDEXER_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new IndexerExpression(this);
        }
    },

    INDEXER_ARGUMENTS(false) {
        @Override
        public SourceNode createNode() {
            return new IndexerArguments(this);
        }
    },

    INDEXER_ARGUMENTS_SUFFIX(false) {
        @Override
        public SourceNode createNode() {
            return new IndexerArgumentsSuffix(this);
        }
    },

    INDEXER_ARGUMENTS_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new IndexerArgumentsTail(this);
        }
    },

    INDEXER_ARGUMENT(false) {
        @Override
        public SourceNode createNode() {
            return new IndexerArgument(this);
        }
    },

    INTEGER_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new IntegerLiteral(this);
        }
    },

    LITERAL_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new LiteralExpression(this);
        }
    },

    NULL_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new NullLiteral(this);
        }
    },

    PARENTHETICAL_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new ParentheticalExpression(this);
        }
    },

    PRIMARY_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new PrimaryExpression(this);
        }
    },

    MODULE_DECLARATION(false) {
        @Override
        public SourceNode createNode() {
            return new ModuleDeclaration(this);
        }
    },

    QUALIFIED_IDENTIFIER(false) {
        @Override
        public SourceNode createNode() {
            return new QualifiedIdentifier(this);
        }
    },

    QUALIFIED_IDENTIFIER_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new QualifiedIdentifierTail(this);
        }
    },

    SELECTOR_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new SelectorExpression(this);
        }
    },

    SELECTOR_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new SelectorExpressionTail(this);
        }
    },

    DECLARATION_SEQUENCE(false) {
        @Override
        public SourceNode createNode() {
            return new DeclarationSequence(this);
        }
    },

    DECLARATION_SEQUENCE_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new DeclarationSequenceTail(this);
        }
    },

    STRING_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new StringLiteral(this);
        }
    },

    TERNARY_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new TernaryExpression(this);
        }
    },

    TERNARY_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new TernaryExpressionTail(this);
        }
    },

    UNARY_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new UnaryExpression(this);
        }
    },

    LOGICAL_OR_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    LOGICAL_OR_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    LOGICAL_AND_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    LOGICAL_AND_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    LOGICAL_NOT_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new UnaryExpression(this);
        }
    },

    EQUALITY_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    EQUALITY_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    SHIFT_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    SHIFT_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    COALESCE_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    COALESCE_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    BITWISE_XOR_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    BITWISE_XOR_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    BITWISE_OR_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    BITWISE_OR_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    BITWISE_AND_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    BITWISE_AND_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    ADDITIVE_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    ADDITIVE_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    MULTIPLICATIVE_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpression(this);
        }
    },

    MULTIPLICATIVE_EXPRESSION_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new BinaryExpressionTail(this);
        }
    },

    DECLARATION(false) {
        @Override
        public SourceNode createNode() {
            return new Declaration(this);
        }
    },

    DECLARATION_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new DeclarationLiteral(this);
        }
    },

    FUNCTION_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new FunctionLiteral(this);
        }
    },

    CONSTANT_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new ConstantExpression(this);
        }
    },

    LAMBDA_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new LambdaLiteral(this);
        }
    },

    FUNCTION_ARGUMENTS(false) {
        @Override
        public SourceNode createNode() {
            return new FunctionArguments(this);
        }
    },

    LAMBDA_ARGUMENT(false) {
        @Override
        public SourceNode createNode() {
            return new LambdaArgument(this);
        }
    },

    FUNCTION_ARGUMENTS_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new FunctionArgumentsTail(this);
        }
    },

    OBJECT_LITERAL(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectLiteral(this);
        }
    },

    OBJECT_HEADER(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectHeader(this);
        }
    },

    OBJECT_ARGUMENTS(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectArguments(this);
        }
    },

    OBJECT_ARGUMENTS_LIST(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectArgumentsList(this);
        }
    },

    OBJECT_ARGUMENT(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectArgument(this);
        }
    },

    OBJECT_BODY(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectBody(this);
        }
    },

    OBJECT_MEMBERS(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectMembers(this);
        }
    },

    OBJECT_MEMBERS_SUFFIX(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectMembersSuffix(this);
        }
    },

    OBJECT_MEMBERS_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectMembersTail(this);
        }
    },

    OBJECT_MEMBER(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectMember(this);
        }
    },

    OBJECT_MEMBER_NAME(false) {
        @Override
        public SourceNode createNode() {
            return new ObjectMemberName(this);
        }
    },

    APPLY_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new ApplyExpression(this);
        }
    },

    MODULE_HEADER(false) {
        @Override
        public SourceNode createNode() {
            return new ModuleHeader(this);
        }
    },

    MODULE_IDENTIFIER(false) {
        @Override
        public SourceNode createNode() {
            return new ModuleIdentifier(this);
        }
    },

    MODULE_IDENTIFIER_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new ModuleIdentifierTail(this);
        }
    },

    IMPORT_HEADERS(false) {
        @Override
        public SourceNode createNode() {
            return new ImportHeaders(this);
        }
    },

    IMPORT_HEADER(false) {
        @Override
        public SourceNode createNode() {
            return new ImportHeader(this);
        }
    },

    IMPORT_HEADER_SUFFIX(false) {
        @Override
        public SourceNode createNode() {
            return new ImportHeaderSuffix(this);
        }
    },

    IMPORT_HEADER_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new ImportHeaderTail(this);
        }
    },

    IMPORT_IDENTIFIER(false) {
        @Override
        public SourceNode createNode() {
            return new ImportIdentifier(this);
        }
    },

    IMPORT_IDENTIFIER_ALIAS(false) {
        @Override
        public SourceNode createNode() {
            return new ImportIdentifierAlias(this);
        }
    },

    IMPORT_IDENTIFIER_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new ImportIdentifierTail(this);
        }
    },

    IMPORT_STATEMENT(false) {
        @Override
        public SourceNode createNode() {
            return new ImportStatement(this);
        }
    },

    FROM_STATEMENT(false) {
        @Override
        public SourceNode createNode() {
            return new FromStatement(this);
        }
    },

    FROM_IDENTIFIER(false) {
        @Override
        public SourceNode createNode() {
            return new FromIdentifier(this);
        }
    },

    FROM_IDENTIFIER_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new FromIdentifierTail(this);
        }
    },

    FROM_IDENTIFIERS(false) {
        @Override
        public SourceNode createNode() {
            return new FromIdentifiers(this);
        }
    },

    FROM_IDENTIFIER_LIST(false) {
        @Override
        public SourceNode createNode() {
            return new FromIdentifierList(this);
        }
    },

    FROM_IDENTIFIER_LIST_TAIL(false) {
        @Override
        public SourceNode createNode() {
            return new FromIdentifierListTail(this);
        }
    },

    SINGLE_OBJECT_ARGUMENT(false) {
        @Override
        public SourceNode createNode() {
            return new SingleObjectArgument(this);
        }
    },

    JAVA_EXPRESSION(false) {
        @Override
        public SourceNode createNode() {
            return new JavaExpression(this);
        }
    }
    ;

    public static final NodeKind ANYTHING_ELSE = ANYTHING;

    private final boolean terminal;

    private NodeKind() {
        this(true);
    }

    private NodeKind(boolean terminal) {
        this.terminal = terminal;
    }

    public SourceNode createNode() {
        return new SourceNode(this);
    }

    public boolean isTerminal() {
        return terminal;
    }
}