package org.reasm.m68k.source; import java.util.Collections; import java.util.Set; import javax.annotation.Nonnull; import org.reasm.commons.source.BasicBlockParser; import org.reasm.commons.source.BlockParser; import org.reasm.source.ParseError; import org.reasm.source.SourceNode; final class BlockParsers { @Nonnull static final Set<Class<? extends SourceNode>> DO_BLOCK_TYPES = singleType(DoBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> FOR_BLOCK_TYPES = singleType(ForBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> IF_BLOCK_TYPES = singleType(IfBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> MACRO_BLOCK_TYPES = singleType(MacroBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> NAMESPACE_BLOCK_TYPES = singleType(NamespaceBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> OBJ_BLOCK_TYPES = singleType(ObjBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> REPT_BLOCK_TYPES = singleType(ReptBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> TRANSFORM_BLOCK_TYPES = singleType(TransformBlock.class); @Nonnull static final Set<Class<? extends SourceNode>> WHILE_BLOCK_TYPES = singleType(WhileBlock.class); @Nonnull static final BlockParser DO = new BasicBlockParser(M68KBlockDirectives.UNTIL) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return DO_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new DoBlock(childNodes, parseError); }; }; @Nonnull static final BlockParser FOR = new BasicBlockParser(M68KBlockDirectives.NEXT) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return FOR_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new ForBlock(childNodes, parseError); }; }; @Nonnull static final BlockParser IF = M68KIfBlockParser.INSTANCE; @Nonnull static final BlockParser MACRO = new BasicBlockParser(M68KBlockDirectives.ENDM) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return MACRO_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new MacroBlock(childNodes, parseError); }; @Override protected SourceNode createBodyBlock(Iterable<? extends SourceNode> childNodes) { return new MacroBody(childNodes); } }; @Nonnull static final BlockParser NAMESPACE = new BasicBlockParser(M68KBlockDirectives.ENDNS) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return NAMESPACE_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new NamespaceBlock(childNodes, parseError); } }; @Nonnull static final BlockParser OBJ = new ObjBlockParser(M68KBlockDirectives.OBJEND); @Nonnull static final BlockParser PHASE = new ObjBlockParser(M68KBlockDirectives.DEPHASE); @Nonnull static final BlockParser REPT = new BasicBlockParser(M68KBlockDirectives.ENDR) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return REPT_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new ReptBlock(childNodes, parseError); } @Override protected SourceNode createBodyBlock(Iterable<? extends SourceNode> childNodes) { return new ReptBody(childNodes); } }; @Nonnull static final BlockParser TRANSFORM = new BasicBlockParser(M68KBlockDirectives.ENDTRANSFORM) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return TRANSFORM_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new TransformBlock(childNodes, parseError); } }; @Nonnull static final BlockParser WHILE = new BasicBlockParser(M68KBlockDirectives.ENDW) { @Override public Iterable<Class<? extends SourceNode>> getOutputNodeTypes() { return WHILE_BLOCK_TYPES; } @Override protected SourceNode createBlock(Iterable<? extends SourceNode> childNodes, ParseError parseError) { return new WhileBlock(childNodes, parseError); } }; @Nonnull private static Set<Class<? extends SourceNode>> singleType(@Nonnull Class<? extends SourceNode> type) { return Collections.<Class<? extends SourceNode>> singleton(type); } // This class is not meant to be instantiated. private BlockParsers() { } }