package org.reasm.m68k.source; import java.util.Collections; import java.util.Map; import java.util.TreeMap; import javax.annotation.Nonnull; import org.reasm.commons.source.BlockDirective; import org.reasm.m68k.assembly.internal.Mnemonics; /** * Defines the directives recognized as block delimiters by the parser. These directives are recognized in <em>any</em> context. * Therefore, a macro whose name matches one of these directives cannot be invoked. * * @author Francis Gagné */ public final class M68KBlockDirectives { /** The <code>DEPHASE</code> directive. */ @Nonnull public static final BlockDirective DEPHASE; /** The <code>DO</code> directive. */ @Nonnull public static final BlockDirective DO; /** The <code>ELSE</code> directive. */ @Nonnull public static final BlockDirective ELSE; /** The <code>ELSEIF</code> directive. */ @Nonnull public static final BlockDirective ELSEIF; /** The <code>ENDC</code> directive. */ @Nonnull public static final BlockDirective ENDC; /** The <code>ENDIF</code> directive. */ @Nonnull public static final BlockDirective ENDIF; /** The <code>ENDM</code> directive. */ @Nonnull public static final BlockDirective ENDM; /** The <code>ENDNS</code> directive. */ @Nonnull public static final BlockDirective ENDNS; /** The <code>ENDR</code> directive. */ @Nonnull public static final BlockDirective ENDR; /** The <code>ENDTRANSFORM</code> directive. */ @Nonnull public static final BlockDirective ENDTRANSFORM; /** The <code>ENDW</code> directive. */ @Nonnull public static final BlockDirective ENDW; /** The <code>FOR</code> directive. */ @Nonnull public static final BlockDirective FOR; /** The <code>IF</code> directive. */ @Nonnull public static final BlockDirective IF; /** The <code>MACRO</code> directive. */ @Nonnull public static final BlockDirective MACRO; /** The <code>NAMESPACE</code> directive. */ @Nonnull public static final BlockDirective NAMESPACE; /** The <code>NEXT</code> directive. */ @Nonnull public static final BlockDirective NEXT; /** The <code>OBJ</code> directive. */ @Nonnull public static final BlockDirective OBJ; /** The <code>OBJEND</code> directive. */ @Nonnull public static final BlockDirective OBJEND; /** The <code>PHASE</code> directive. */ @Nonnull public static final BlockDirective PHASE; /** The <code>REPT</code> directive. */ @Nonnull public static final BlockDirective REPT; /** The <code>TRANSFORM</code> directive. */ @Nonnull public static final BlockDirective TRANSFORM; /** The <code>UNTIL</code> directive. */ @Nonnull public static final BlockDirective UNTIL; /** The <code>WHILE</code> directive. */ @Nonnull public static final BlockDirective WHILE; /** A map of mnemonics to the corresponding {@link BlockDirective}. The map uses a case-insensitive comparator for keys. */ @Nonnull public static final Map<String, BlockDirective> MAP; static { final Map<String, BlockDirective> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); DEPHASE = define(map, Mnemonics.DEPHASE); DO = define(map, Mnemonics.DO); ELSE = define(map, Mnemonics.ELSE); ELSEIF = define(map, Mnemonics.ELSEIF); ENDC = define(map, Mnemonics.ENDC); ENDIF = define(map, Mnemonics.ENDIF); ENDM = define(map, Mnemonics.ENDM); ENDNS = define(map, Mnemonics.ENDNS); ENDR = define(map, Mnemonics.ENDR); ENDTRANSFORM = define(map, Mnemonics.ENDTRANSFORM); ENDW = define(map, Mnemonics.ENDW); FOR = define(map, Mnemonics.FOR); IF = define(map, Mnemonics.IF); MACRO = define(map, Mnemonics.MACRO); NAMESPACE = define(map, Mnemonics.NAMESPACE); NEXT = define(map, Mnemonics.NEXT); OBJ = define(map, Mnemonics.OBJ); OBJEND = define(map, Mnemonics.OBJEND); PHASE = define(map, Mnemonics.PHASE); REPT = define(map, Mnemonics.REPT); TRANSFORM = define(map, Mnemonics.TRANSFORM); UNTIL = define(map, Mnemonics.UNTIL); WHILE = define(map, Mnemonics.WHILE); MAP = Collections.unmodifiableMap(map); } @Nonnull private static BlockDirective define(@Nonnull Map<String, BlockDirective> map, @Nonnull String mnemonic) { final BlockDirective blockDirective = new BlockDirective(mnemonic); map.put(blockDirective.getMnemonic(), blockDirective); return blockDirective; } // This class is not meant to be instantiated. private M68KBlockDirectives() { } }