#include #include "token.hpp" namespace dsp { struct keyword { inline static constexpr std::optional find(const std::string_view s) { if (s.length() == 0) { return {}; } std::string_view::size_type ix = 0; switch (s[ix++]) { case 'A': [[fallthrough]]; case 'a': if (ix == s.length()) return { token_t::type_t::_a }; else { switch (s[ix++]) { case 'D': [[fallthrough]]; case 'd': if (ix < s.length()) { switch (s[ix++]) { case '2': if (ix == s.length()) return { token_t::type_t::_ad2 }; break; case 'D': [[fallthrough]]; case 'd': if (ix == s.length()) return { token_t::type_t::_add }; break; } } break; case 'L': [[fallthrough]]; case 'l': if (ix < s.length()) { switch (s[ix++]) { case 'H': [[fallthrough]]; case 'h': if (ix == s.length()) return { token_t::type_t::_alh }; break; case 'L': [[fallthrough]]; case 'l': if (ix == s.length()) return { token_t::type_t::_all }; break; case 'U': [[fallthrough]]; case 'u': if (ix == s.length()) return { token_t::type_t::_alu }; break; } } break; case 'N': [[fallthrough]]; case 'n': if (ix < s.length()) { switch (s[ix++]) { case 'D': [[fallthrough]]; case 'd': if (ix == s.length()) return { token_t::type_t::_and }; break; } } break; } } break; case 'B': [[fallthrough]]; case 'b': if (ix < s.length()) { switch (s[ix++]) { case 'T': [[fallthrough]]; case 't': if (ix < s.length()) { switch (s[ix++]) { case 'M': [[fallthrough]]; case 'm': if (ix == s.length()) return { token_t::type_t::_btm }; break; } } break; } } break; case 'C': [[fallthrough]]; case 'c': if (ix == s.length()) return { token_t::type_t::_c }; else { switch (s[ix++]) { case 'L': [[fallthrough]]; case 'l': if (ix < s.length()) { switch (s[ix++]) { case 'R': [[fallthrough]]; case 'r': if (ix == s.length()) return { token_t::type_t::_clr }; break; } } break; case 'T': [[fallthrough]]; case 't': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_ct0 }; break; case '1': if (ix == s.length()) return { token_t::type_t::_ct1 }; break; case '2': if (ix == s.length()) return { token_t::type_t::_ct2 }; break; case '3': if (ix == s.length()) return { token_t::type_t::_ct3 }; break; } } break; } } break; case 'D': [[fallthrough]]; case 'd': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_d0 }; break; case 'M': [[fallthrough]]; case 'm': if (ix < s.length()) { switch (s[ix++]) { case 'A': [[fallthrough]]; case 'a': if (ix == s.length()) return { token_t::type_t::_dma }; else { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_dma0 }; break; case '1': if (ix == s.length()) return { token_t::type_t::_dma1 }; else { switch (s[ix++]) { case '6': if (ix == s.length()) return { token_t::type_t::_dma16 }; break; } } break; case '2': if (ix == s.length()) return { token_t::type_t::_dma2 }; break; case '3': if (ix < s.length()) { switch (s[ix++]) { case '2': if (ix == s.length()) return { token_t::type_t::_dma32 }; break; } } break; case '4': if (ix == s.length()) return { token_t::type_t::_dma4 }; break; case '6': if (ix < s.length()) { switch (s[ix++]) { case '4': if (ix == s.length()) return { token_t::type_t::_dma64 }; break; } } break; case '8': if (ix == s.length()) return { token_t::type_t::_dma8 }; break; case 'H': [[fallthrough]]; case 'h': if (ix == s.length()) return { token_t::type_t::_dmah }; else { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_dmah0 }; break; case '1': if (ix == s.length()) return { token_t::type_t::_dmah1 }; else { switch (s[ix++]) { case '6': if (ix == s.length()) return { token_t::type_t::_dmah16 }; break; } } break; case '2': if (ix == s.length()) return { token_t::type_t::_dmah2 }; break; case '3': if (ix < s.length()) { switch (s[ix++]) { case '2': if (ix == s.length()) return { token_t::type_t::_dmah32 }; break; } } break; case '4': if (ix == s.length()) return { token_t::type_t::_dmah4 }; break; case '6': if (ix < s.length()) { switch (s[ix++]) { case '4': if (ix == s.length()) return { token_t::type_t::_dmah64 }; break; } } break; case '8': if (ix == s.length()) return { token_t::type_t::_dmah8 }; break; } } break; } } break; } } break; } } break; case 'E': [[fallthrough]]; case 'e': if (ix < s.length()) { switch (s[ix++]) { case 'N': [[fallthrough]]; case 'n': if (ix < s.length()) { switch (s[ix++]) { case 'D': [[fallthrough]]; case 'd': if (ix == s.length()) return { token_t::type_t::_end }; else { switch (s[ix++]) { case 'I': [[fallthrough]]; case 'i': if (ix == s.length()) return { token_t::type_t::_endi }; break; } } break; } } break; case 'Q': [[fallthrough]]; case 'q': if (ix < s.length()) { switch (s[ix++]) { case 'U': [[fallthrough]]; case 'u': if (ix == s.length()) return { token_t::type_t::_equ }; break; } } break; } } break; case 'J': [[fallthrough]]; case 'j': if (ix < s.length()) { switch (s[ix++]) { case 'M': [[fallthrough]]; case 'm': if (ix < s.length()) { switch (s[ix++]) { case 'P': [[fallthrough]]; case 'p': if (ix == s.length()) return { token_t::type_t::_jmp }; break; } } break; } } break; case 'L': [[fallthrough]]; case 'l': if (ix < s.length()) { switch (s[ix++]) { case 'O': [[fallthrough]]; case 'o': if (ix < s.length()) { switch (s[ix++]) { case 'P': [[fallthrough]]; case 'p': if (ix == s.length()) return { token_t::type_t::_lop }; break; } } break; case 'P': [[fallthrough]]; case 'p': if (ix < s.length()) { switch (s[ix++]) { case 'S': [[fallthrough]]; case 's': if (ix == s.length()) return { token_t::type_t::_lps }; break; } } break; } } break; case 'M': [[fallthrough]]; case 'm': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_m0 }; break; case '1': if (ix == s.length()) return { token_t::type_t::_m1 }; break; case '2': if (ix == s.length()) return { token_t::type_t::_m2 }; break; case '3': if (ix == s.length()) return { token_t::type_t::_m3 }; break; case 'C': [[fallthrough]]; case 'c': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_mc0 }; break; case '1': if (ix == s.length()) return { token_t::type_t::_mc1 }; break; case '2': if (ix == s.length()) return { token_t::type_t::_mc2 }; break; case '3': if (ix == s.length()) return { token_t::type_t::_mc3 }; break; } } break; case 'O': [[fallthrough]]; case 'o': if (ix < s.length()) { switch (s[ix++]) { case 'V': [[fallthrough]]; case 'v': if (ix == s.length()) return { token_t::type_t::_mov }; break; } } break; case 'U': [[fallthrough]]; case 'u': if (ix < s.length()) { switch (s[ix++]) { case 'L': [[fallthrough]]; case 'l': if (ix == s.length()) return { token_t::type_t::_mul }; break; } } break; case 'V': [[fallthrough]]; case 'v': if (ix < s.length()) { switch (s[ix++]) { case 'I': [[fallthrough]]; case 'i': if (ix == s.length()) return { token_t::type_t::_mvi }; break; } } break; } } break; case 'N': [[fallthrough]]; case 'n': if (ix < s.length()) { switch (s[ix++]) { case 'C': [[fallthrough]]; case 'c': if (ix == s.length()) return { token_t::type_t::_nc }; break; case 'O': [[fallthrough]]; case 'o': if (ix < s.length()) { switch (s[ix++]) { case 'P': [[fallthrough]]; case 'p': if (ix == s.length()) return { token_t::type_t::_nop }; break; } } break; case 'S': [[fallthrough]]; case 's': if (ix == s.length()) return { token_t::type_t::_ns }; break; case 'T': [[fallthrough]]; case 't': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_nt0 }; break; } } break; case 'Z': [[fallthrough]]; case 'z': if (ix == s.length()) return { token_t::type_t::_nz }; else { switch (s[ix++]) { case 'S': [[fallthrough]]; case 's': if (ix == s.length()) return { token_t::type_t::_nzs }; break; } } break; } } break; case 'O': [[fallthrough]]; case 'o': if (ix < s.length()) { switch (s[ix++]) { case 'R': [[fallthrough]]; case 'r': if (ix == s.length()) return { token_t::type_t::_or }; else { switch (s[ix++]) { case 'G': [[fallthrough]]; case 'g': if (ix == s.length()) return { token_t::type_t::_org }; break; } } break; } } break; case 'P': [[fallthrough]]; case 'p': if (ix == s.length()) return { token_t::type_t::_p }; else { switch (s[ix++]) { case 'C': [[fallthrough]]; case 'c': if (ix == s.length()) return { token_t::type_t::_pc }; break; case 'L': [[fallthrough]]; case 'l': if (ix == s.length()) return { token_t::type_t::_pl }; break; case 'R': [[fallthrough]]; case 'r': if (ix < s.length()) { switch (s[ix++]) { case 'G': [[fallthrough]]; case 'g': if (ix == s.length()) return { token_t::type_t::_prg }; break; } } break; } } break; case 'R': [[fallthrough]]; case 'r': if (ix < s.length()) { switch (s[ix++]) { case 'A': [[fallthrough]]; case 'a': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_ra0 }; break; } } break; case 'L': [[fallthrough]]; case 'l': if (ix == s.length()) return { token_t::type_t::_rl }; else { switch (s[ix++]) { case '8': if (ix == s.length()) return { token_t::type_t::_rl8 }; break; } } break; case 'R': [[fallthrough]]; case 'r': if (ix == s.length()) return { token_t::type_t::_rr }; break; case 'X': [[fallthrough]]; case 'x': if (ix == s.length()) return { token_t::type_t::_rx }; break; } } break; case 'S': [[fallthrough]]; case 's': if (ix == s.length()) return { token_t::type_t::_s }; else { switch (s[ix++]) { case 'L': [[fallthrough]]; case 'l': if (ix == s.length()) return { token_t::type_t::_sl }; break; case 'R': [[fallthrough]]; case 'r': if (ix == s.length()) return { token_t::type_t::_sr }; break; case 'U': [[fallthrough]]; case 'u': if (ix < s.length()) { switch (s[ix++]) { case 'B': [[fallthrough]]; case 'b': if (ix == s.length()) return { token_t::type_t::_sub }; break; } } break; } } break; case 'T': [[fallthrough]]; case 't': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_t0 }; break; case 'O': [[fallthrough]]; case 'o': if (ix < s.length()) { switch (s[ix++]) { case 'P': [[fallthrough]]; case 'p': if (ix == s.length()) return { token_t::type_t::_top }; break; } } break; } } break; case 'W': [[fallthrough]]; case 'w': if (ix < s.length()) { switch (s[ix++]) { case 'A': [[fallthrough]]; case 'a': if (ix < s.length()) { switch (s[ix++]) { case '0': if (ix == s.length()) return { token_t::type_t::_wa0 }; break; } } break; } } break; case 'X': [[fallthrough]]; case 'x': if (ix == s.length()) return { token_t::type_t::_x }; else { switch (s[ix++]) { case 'O': [[fallthrough]]; case 'o': if (ix < s.length()) { switch (s[ix++]) { case 'R': [[fallthrough]]; case 'r': if (ix == s.length()) return { token_t::type_t::_xor }; break; } } break; } } break; case 'Y': [[fallthrough]]; case 'y': if (ix == s.length()) return { token_t::type_t::_y }; break; case 'Z': [[fallthrough]]; case 'z': if (ix == s.length()) return { token_t::type_t::_z }; else { switch (s[ix++]) { case 'S': [[fallthrough]]; case 's': if (ix == s.length()) return { token_t::type_t::_zs }; break; } } break; } return {}; } }; }