{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# LINE 9 "src/Verismith/Verilog2005/Lexer.x" #-}
{-# OPTIONS_GHC -w #-}

module Verismith.Verilog2005.Lexer
  ( scanTokens
  , parseDecimal
  , isKW
  , isIdentSimple
  , VerilogVersion (..)
  , makeString
  )
where

import Data.Bits
import Data.Word (Word8)
import Numeric.Natural
import GHC.Natural
import Data.List.NonEmpty (NonEmpty (..))
import Data.Maybe (mapMaybe)
import Text.Printf (printf)
import Control.Monad.State.Strict
import Control.Monad.Except
import Control.Exception
import qualified Data.ByteString as SBS
import qualified Data.ByteString.Lazy as LBS
import Data.ByteString.Internal (c2w, w2c, unpackChars, packChars)
import qualified Data.HashMap.Strict as HashMap
import Verismith.Verilog2005.Token
#if __GLASGOW_HASKELL__ >= 603
#include "ghcconfig.h"
#elif defined(__GLASGOW_HASKELL__)
#include "config.h"
#endif
#if __GLASGOW_HASKELL__ >= 503
import Data.Array
#else
import Array
#endif
#if __GLASGOW_HASKELL__ >= 503
import Data.Array.Base (unsafeAt)
import GHC.Exts
#else
import GlaExts
#endif
alex_tab_size :: Int
alex_tab_size = 8
alex_base :: AlexAddr
alex_base = AlexA#
  "\xf8\xff\xff\xff\x6e\x00\x00\x00\x72\x00\x00\x00\xc7\x00\x00\x00\xe4\x00\x00\x00\x31\x01\x00\x00\x4d\x01\x00\x00\x8f\x00\x00\x00\x77\x01\x00\x00\xaf\x00\x00\x00\x11\x01\x00\x00\x97\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\xff\xff\xff\x00\x00\x00\x00\xd6\xff\xff\xff\x00\x00\x00\x00\xde\xff\xff\xff\xd9\xff\xff\xff\x00\x00\x00\x00\xda\xff\xff\xff\x98\xff\xff\xff\x00\x00\x00\x00\xf4\x00\x00\x00\x99\x01\x00\x00\xe4\x01\x00\x00\xad\xff\xff\xff\x4f\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x00\x00\xdf\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xff\xff\xff\x9a\x01\x00\x00\xae\xff\xff\xff\xfb\x01\x00\x00\x33\x02\x00\x00\x9d\xff\xff\xff\xb2\xff\xff\xff\xb3\xff\xff\xff\xa8\xff\xff\xff\xb1\xff\xff\xff\x00\x00\x00\x00\xa4\xff\xff\xff\xb8\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x53\x00\x00\x00\x61\x00\x00\x00\x6f\x00\x00\x00\x69\x02\x00\x00\xa3\x02\x00\x00\xfd\x02\x00\x00\x4c\x03\x00\x00\x3d\x02\x00\x00\x53\x02\x00\x00\x00\x00\x00\x00\x67\x00\x00\x00\x87\x00\x00\x00\x6b\x03\x00\x00\xc5\x03\x00\x00\x20\x04\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x57\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1e\x00\x00\x00\x86\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x77\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x76\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00"#

alex_table :: AlexAddr
alex_check :: AlexAddr
alex_table = Addr# -> AlexAddr
AlexA#
  Addr#
"\x00\x00\x42\x00\x42\x00\x0e\x00\x42\x00\x19\x00\x18\x00\x10\x00\x45\x00\x1e\x00\x1d\x00\x21\x00\x25\x00\x47\x00\x38\x00\x32\x00\x32\x00\x3c\x00\x3b\x00\x3d\x00\x3f\x00\x3e\x00\x40\x00\x1b\x00\x42\x00\x5a\x00\x4f\x00\x68\x00\x6b\x00\x61\x00\x59\x00\x37\x00\x79\x00\x29\x00\x69\x00\x66\x00\x2d\x00\x0f\x00\x6a\x00\x60\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x2b\x00\x2c\x00\x62\x00\x5b\x00\x63\x00\x67\x00\x5c\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x2e\x00\x52\x00\x2f\x00\x5e\x00\x51\x00\x49\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x64\x00\x5d\x00\x65\x00\x5f\x00\x42\x00\x42\x00\xff\xff\x42\x00\x42\x00\x42\x00\x44\x00\x42\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x4e\x00\x44\x00\x45\x00\x32\x00\x32\x00\x42\x00\x43\x00\x47\x00\xff\xff\x42\x00\x72\x00\x71\x00\x70\x00\x11\x00\x73\x00\x42\x00\x42\x00\x2d\x00\x42\x00\x6c\x00\x46\x00\x30\x00\x30\x00\x0d\x00\x46\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x6e\x00\x45\x00\x26\x00\x42\x00\x13\x00\x25\x00\x47\x00\x14\x00\x32\x00\x15\x00\x32\x00\x17\x00\x42\x00\x42\x00\x16\x00\x42\x00\x76\x00\x0c\x00\x46\x00\x78\x00\x1a\x00\x42\x00\x42\x00\x50\x00\x42\x00\x00\x00\x31\x00\x00\x00\x31\x00\x2e\x00\x25\x00\x2f\x00\x25\x00\x00\x00\x49\x00\x42\x00\x42\x00\x42\x00\x49\x00\x42\x00\x32\x00\x00\x00\x32\x00\x00\x00\x42\x00\x75\x00\x77\x00\x00\x00\x7a\x00\x74\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x31\x00\x42\x00\x31\x00\x00\x00\x25\x00\x00\x00\x25\x00\x42\x00\x42\x00\x49\x00\x42\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x00\x00\x6f\x00\x00\x00\x42\x00\x00\x00\x24\x00\x00\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x00\x00\x49\x00\x00\x00\x00\x00\x00\x00\x46\x00\x22\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x00\x42\x00\x00\x00\x42\x00\x00\x00\x24\x00\x00\x00\x24\x00\x00\x00\x22\x00\x22\x00\x22\x00\x00\x00\x49\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x00\x42\x00\x22\x00\x42\x00\x22\x00\x24\x00\x46\x00\x24\x00\x1f\x00\x00\x00\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\x22\x00\x00\x00\x00\x00\x42\x00\x54\x00\x22\x00\x57\x00\x00\x00\x42\x00\x42\x00\x58\x00\x42\x00\x00\x00\x00\x00\x22\x00\x00\x00\x22\x00\x56\x00\x46\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x00\x00\x00\x00\x00\x00\x22\x00\x42\x00\x22\x00\x00\x00\x23\x00\x49\x00\x54\x00\x00\x00\x57\x00\x28\x00\x29\x00\x35\x00\x58\x00\x00\x00\x2a\x00\x00\x00\x46\x00\x33\x00\x33\x00\x56\x00\x42\x00\x42\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x23\x00\x00\x00\x23\x00\x34\x00\x00\x00\x00\x00\x34\x00\x00\x00\x49\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x35\x00\x00\x00\x35\x00\x42\x00\x42\x00\x00\x00\x42\x00\x00\x00\x33\x00\x46\x00\x00\x00\x00\x00\x23\x00\x00\x00\x23\x00\x00\x00\x49\x00\x00\x00\x34\x00\x00\x00\x00\x00\x36\x00\x35\x00\x00\x00\x00\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x35\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x46\x00\x00\x00\x00\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x00\x23\x00\x00\x00\x00\x00\x00\x00\x54\x00\x41\x00\x57\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x41\x00\x41\x00\x00\x00\x41\x00\x00\x00\x56\x00\x1b\x00\x00\x00\x41\x00\x55\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x49\x00\x23\x00\x00\x00\x00\x00\x00\x00\x54\x00\x20\x00\x57\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x20\x00\x20\x00\x00\x00\x20\x00\x00\x00\x56\x00\x21\x00\x00\x00\x20\x00\x55\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x23\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x39\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x4c\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x48\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4a\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x51\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x52\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x00\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#

alex_check :: AlexAddr
alex_deflt :: AlexAddr
alex_check = Addr# -> AlexAddr
AlexA#
  "\xff\xff\x09\x00\x0a\x00\x3a\x00\x0c\x00\x30\x00\x30\x00\x3e\x00\x2a\x00\x30\x00\x30\x00\x73\x00\x5f\x00\x2f\x00\x6e\x00\x30\x00\x31\x00\x74\x00\x64\x00\x61\x00\x6c\x00\x62\x00\x65\x00\x73\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0a\x00\x0c\x00\x09\x00\x0a\x00\x2a\x00\x0c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x2a\x00\x2a\x00\x30\x00\x31\x00\x20\x00\x2f\x00\x2f\x00\x0a\x00\x20\x00\x26\x00\x3d\x00\x3d\x00\x3e\x00\x7c\x00\x09\x00\x0a\x00\x2c\x00\x0c\x00\x7e\x00\x2f\x00\x30\x00\x31\x00\x3a\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x26\x00\x2a\x00\x5f\x00\x20\x00\x3d\x00\x3f\x00\x2f\x00\x3d\x00\x58\x00\x3c\x00\x5a\x00\x26\x00\x09\x00\x0a\x00\x3e\x00\x0c\x00\x3c\x00\x3d\x00\x2f\x00\x2a\x00\x31\x00\x09\x00\x0a\x00\x5c\x00\x0c\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x58\x00\x5d\x00\x5a\x00\xff\xff\x60\x00\x20\x00\x09\x00\x0a\x00\x60\x00\x0c\x00\x78\x00\xff\xff\x7a\x00\xff\xff\x20\x00\x3d\x00\x3e\x00\xff\xff\x29\x00\x2a\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5e\x00\xff\xff\x78\x00\x20\x00\x7a\x00\xff\xff\x78\x00\xff\xff\x7a\x00\x09\x00\x0a\x00\x60\x00\x0c\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x7c\x00\xff\xff\x20\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\x2f\x00\x30\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\x3f\x00\x30\x00\x31\x00\xff\xff\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\x58\x00\x0c\x00\x5a\x00\x78\x00\x2f\x00\x7a\x00\x31\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\xff\xff\x20\x00\x42\x00\x5f\x00\x44\x00\xff\xff\x09\x00\x0a\x00\x48\x00\x0c\x00\xff\xff\xff\xff\x78\x00\xff\xff\x7a\x00\x4f\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x78\x00\x20\x00\x7a\x00\xff\xff\x3f\x00\x60\x00\x62\x00\xff\xff\x64\x00\x28\x00\x29\x00\x2a\x00\x68\x00\xff\xff\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x6f\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x3b\x00\x58\x00\xff\xff\x5a\x00\x3f\x00\xff\xff\xff\xff\x42\x00\xff\xff\x60\x00\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\x58\x00\x2f\x00\xff\xff\xff\xff\x78\x00\xff\xff\x7a\x00\xff\xff\x60\x00\xff\xff\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\x72\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x2f\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x42\x00\x66\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x6d\x00\x6e\x00\xff\xff\x70\x00\xff\xff\x4f\x00\x73\x00\xff\xff\x75\x00\x53\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\xff\xff\xff\xff\x60\x00\x5f\x00\xff\xff\xff\xff\xff\xff\x62\x00\x66\x00\x64\x00\xff\xff\xff\xff\xff\xff\x68\x00\xff\xff\x6d\x00\x6e\x00\xff\xff\x70\x00\xff\xff\x6f\x00\x73\x00\xff\xff\x75\x00\x73\x00\xff\xff\xff\xff\xff\xff\x78\x00\xff\xff\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\xff\xff\x7a\x00\xff\xff\xff\xff\xff\xff\x45\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#

alex_deflt :: AlexAddr
alex_deflt = AlexA#
  "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#

alex_accept = listArray (0 :: Int, 122)
  [ AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAcc 85
  , AlexAcc 84
  , AlexAcc 83
  , AlexAcc 82
  , AlexAcc 81
  , AlexAcc 80
  , AlexAcc 79
  , AlexAcc 78
  , AlexAcc 77
  , AlexAcc 76
  , AlexAcc 75
  , AlexAcc 74
  , AlexAcc 73
  , AlexAcc 72
  , AlexAcc 71
  , AlexAcc 70
  , AlexAcc 69
  , AlexAcc 68
  , AlexAcc 67
  , AlexAcc 66
  , AlexAccNone
  , AlexAcc 65
  , AlexAcc 64
  , AlexAcc 63
  , AlexAcc 62
  , AlexAcc 61
  , AlexAcc 60
  , AlexAcc 59
  , AlexAcc 58
  , AlexAcc 57
  , AlexAcc 56
  , AlexAcc 55
  , AlexAcc 54
  , AlexAcc 53
  , AlexAcc 52
  , AlexAcc 51
  , AlexAccNone
  , AlexAccNone
  , AlexAcc 50
  , AlexAcc 49
  , AlexAcc 48
  , AlexAcc 47
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAcc 46
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAcc 45
  , AlexAccNone
  , AlexAccSkip
  , AlexAccSkip
  , AlexAccNone
  , AlexAccNone
  , AlexAccNone
  , AlexAccSkip
  , AlexAcc 44
  , AlexAccNone
  , AlexAcc 43
  , AlexAcc 42
  , AlexAccNone
  , AlexAccNone
  , AlexAcc 41
  , AlexAccNone
  , AlexAccNone
  , AlexAcc 40
  , AlexAcc 39
  , AlexAcc 38
  , AlexAcc 37
  , AlexAccNone
  , AlexAcc 36
  , AlexAcc 35
  , AlexAcc 34
  , AlexAcc 33
  , AlexAcc 32
  , AlexAcc 31
  , AlexAcc 30
  , AlexAcc 29
  , AlexAcc 28
  , AlexAcc 27
  , AlexAcc 26
  , AlexAcc 25
  , AlexAcc 24
  , AlexAcc 23
  , AlexAcc 22
  , AlexAcc 21
  , AlexAcc 20
  , AlexAcc 19
  , AlexAcc 18
  , AlexAcc 17
  , AlexAcc 16
  , AlexAcc 15
  , AlexAcc 14
  , AlexAcc 13
  , AlexAcc 12
  , AlexAcc 11
  , AlexAcc 10
  , AlexAcc 9
  , AlexAcc 8
  , AlexAcc 7
  , AlexAcc 6
  , AlexAcc 5
  , AlexAcc 4
  , AlexAcc 3
  , AlexAcc 2
  , AlexAcc 1
  , AlexAcc 0
  ]

alex_actions = array (0 :: Int, 86)
  [ (85,alex_action_46)
  , (84,alex_action_47)
  , (83,alex_action_48)
  , (82,alex_action_69)
  , (81,alex_action_49)
  , (80,alex_action_50)
  , (79,alex_action_51)
  , (78,alex_action_52)
  , (77,alex_action_53)
  , (76,alex_action_54)
  , (75,alex_action_55)
  , (74,alex_action_56)
  , (73,alex_action_57)
  , (72,alex_action_57)
  , (71,alex_action_57)
  , (70,alex_action_58)
  , (69,alex_action_59)
  , (68,alex_action_60)
  , (67,alex_action_60)
  , (66,alex_action_60)
  , (65,alex_action_61)
  , (64,alex_action_62)
  , (63,alex_action_63)
  , (62,alex_action_64)
  , (61,alex_action_65)
  , (60,alex_action_66)
  , (59,alex_action_66)
  , (58,alex_action_67)
  , (57,alex_action_68)
  , (56,alex_action_69)
  , (55,alex_action_70)
  , (54,alex_action_71)
  , (53,alex_action_72)
  , (52,alex_action_73)
  , (51,alex_action_74)
  , (50,alex_action_75)
  , (49,alex_action_76)
  , (48,alex_action_77)
  , (47,alex_action_78)
  , (46,alex_action_4)
  , (45,alex_action_79)
  , (44,alex_action_3)
  , (43,alex_action_3)
  , (42,alex_action_4)
  , (41,alex_action_5)
  , (40,alex_action_6)
  , (39,alex_action_7)
  , (38,alex_action_8)
  , (37,alex_action_9)
  , (36,alex_action_10)
  , (35,alex_action_11)
  , (34,alex_action_12)
  , (33,alex_action_13)
  , (32,alex_action_14)
  , (31,alex_action_15)
  , (30,alex_action_16)
  , (29,alex_action_17)
  , (28,alex_action_18)
  , (27,alex_action_19)
  , (26,alex_action_20)
  , (25,alex_action_21)
  , (24,alex_action_22)
  , (23,alex_action_23)
  , (22,alex_action_24)
  , (21,alex_action_25)
  , (20,alex_action_26)
  , (19,alex_action_27)
  , (18,alex_action_28)
  , (17,alex_action_29)
  , (16,alex_action_30)
  , (15,alex_action_31)
  , (14,alex_action_32)
  , (13,alex_action_33)
  , (12,alex_action_34)
  , (11,alex_action_35)
  , (10,alex_action_36)
  , (9,alex_action_37)
  , (8,alex_action_38)
  , (7,alex_action_39)
  , (6,alex_action_40)
  , (5,alex_action_41)
  , (4,alex_action_42)
  , (3,alex_action_43)
  , (2,alex_action_44)
  , (1,alex_action_67)
  , (0,alex_action_45)
  ]


pre2 :: Int
edge,pre10,pre16,pre2,pre8,table,ts0,ts1,ts2,ts3,ts4 :: Int
pre8 :: Int
edge = Int
1
table :: Int
pre10 = Int
2
pre16 = 3
pre2 = 4
pre8 = 5
table = 6
ts4 :: Int
ts0 = 7
ts1 = 8
ts2 = 9
ts3 = 10
ts4 = 11
alex_action_7 :: AlexAction
alex_action_3 = cdcident
alex_action_8 :: AlexAction
alex_action_4 = (ByteString -> Token) -> AlexAction
to LitReal
alex_action_9 :: AlexAction
alex_action_5 = to (LitString . SBS.tail . SBS.init)
alex_action_6 = toa kwident
alex_action_7 = to (escSimpleIdent . SBS.tail)
alex_action_8 = to (IdSystem . SBS.tail)
alex_action_9 = toa (numberBase BBin)
alex_action_14 :: AlexAction
alex_action_10 = Token -> AlexAction
toa (numberBase BOct)
alex_action_15 :: AlexAction
alex_action_11 = Token -> AlexAction
toa (numberBase BDec)
alex_action_16 :: AlexAction
alex_action_12 = Token -> AlexAction
toa (numberBase BHex)
alex_action_17 :: AlexAction
alex_action_13 = Token -> AlexAction
tok Token
AmAmp
alex_action_18 :: AlexAction
alex_action_14 = Token -> AlexAction
tok UnBang
alex_action_19 :: AlexAction
alex_action_15 = Token -> AlexAction
tok SymEq
alex_action_20 :: AlexAction
alex_action_16 = Token -> AlexAction
tok SymAt
alex_action_21 :: AlexAction
alex_action_17 = Token -> AlexAction
tok AmBar
alex_action_22 :: AlexAction
alex_action_18 = Token -> AlexAction
tok Token
AmHat
alex_action_23 :: AlexAction
alex_action_19 = Token -> AlexAction
tok UnTilde
alex_action_24 :: AlexAction
alex_action_20 = Token -> AlexAction
tok BinSlash
alex_action_25 :: AlexAction
alex_action_21 = Token -> AlexAction
tok BinPercent
alex_action_26 :: AlexAction
alex_action_22 = Token -> AlexAction
tok BinLt
alex_action_27 :: AlexAction
alex_action_23 = Token -> AlexAction
tok BinGt
alex_action_28 :: AlexAction
alex_action_24 = Token -> AlexAction
tok SymBraceL
alex_action_29 :: AlexAction
alex_action_25 = Token -> AlexAction
tok SymBraceR
alex_action_30 :: AlexAction
alex_action_26 = Token -> AlexAction
tok SymPlus
alex_action_31 :: AlexAction
alex_action_27 = Token -> AlexAction
tok SymQuestion
alex_action_32 :: AlexAction
alex_action_28 = Token -> AlexAction
tok SymPound
alex_action_33 :: AlexAction
alex_action_29 = Token -> AlexAction
tok SymAster
alex_action_34 :: AlexAction
alex_action_30 = Token -> AlexAction
tok SymDot
alex_action_35 :: AlexAction
alex_action_31 = Token -> AlexAction
tok SymDollar
alex_action_36 :: AlexAction
alex_action_32 = Token -> AlexAction
tok AmTildeHat
alex_action_37 :: AlexAction
alex_action_33 = Token -> AlexAction
tok AmTildeHat
alex_action_38 :: AlexAction
alex_action_34 = Token -> AlexAction
tok UnTildeAmp
alex_action_39 :: AlexAction
alex_action_35 = Token -> AlexAction
tok UnTildeBar
alex_action_40 :: AlexAction
alex_action_36 = Token -> AlexAction
tok BinEqEq
alex_action_41 :: AlexAction
alex_action_37 = Token -> AlexAction
tok BinBangEq
alex_action_42 :: AlexAction
alex_action_38 = Token -> AlexAction
tok BinAmpAmp
alex_action_43 :: AlexAction
alex_action_39 = Token -> AlexAction
tok BinBarBar
alex_action_44 :: AlexAction
alex_action_40 = Token -> AlexAction
tok Token
BinAsterAster
alex_action_45 :: AlexAction
alex_action_41 = Token -> AlexAction
tok BinGtEq
alex_action_46 :: AlexAction
alex_action_42 = Token -> AlexAction
tok Token
BinLtLt
alex_action_47 :: AlexAction
alex_action_43 = Token -> AlexAction
tok BinGtGt
alex_action_48 :: AlexAction
alex_action_44 = Token -> AlexAction
tok SymParenAster
alex_action_49 :: AlexAction
alex_action_45 = Token -> AlexAction
tok SymAsterParen
alex_action_50 :: AlexAction
alex_action_46 = Token -> AlexAction
tok Token
SymLtEq
alex_action_51 :: AlexAction
alex_action_47 = Token -> AlexAction
tok SymPlusColon
alex_action_52 :: AlexAction
alex_action_48 = Token -> AlexAction
tok SymDashColon
alex_action_53 :: AlexAction
alex_action_49 = Token -> AlexAction
tok SymDashGt
alex_action_54 :: AlexAction
alex_action_50 = Token -> AlexAction
tok SymEqGt
alex_action_55 :: AlexAction
alex_action_51 = Token -> AlexAction
tok SymAsterGt
alex_action_56 :: AlexAction
alex_action_52 = Token -> AlexAction
tok BinEqEqEq
alex_action_57 :: AlexAction
alex_action_53 = tok BinBangEqEq
alex_action_58 :: AlexAction
alex_action_54 = tok BinLtLtLt
alex_action_59 :: p -> p -> StateT AlexState (ExceptT String IO) (Maybe PosToken)
alex_action_55 = tok BinGtGtGt
alex_action_60 :: AlexAction
alex_action_56 = tok SymAmpAmpAmp
alex_action_61 :: AlexAction
alex_action_57 = Int -> AlexAction -> AlexAction
startcode ts1 ((ByteString -> Token) -> AlexAction
to tsValue)
alex_action_62 :: AlexAction
alex_action_58 = Int -> AlexAction -> AlexAction
startcode ts2 (to tsUnit)
alex_action_63 :: AlexAction
alex_action_59 = \_ _ -> sc ts3 >> scan
alex_action_64 :: AlexAction
alex_action_60 = Int -> AlexAction -> AlexAction
startcode ts4 (to tsValue)
alex_action_65 :: AlexAction
alex_action_61 = Int -> AlexAction -> AlexAction
startcode Int
0   (to tsUnit)
alex_action_66 :: AlexAction
alex_action_62 = Int -> AlexAction -> AlexAction
startcode Int
0 ((ByteString -> Token) -> AlexAction
to binary)
alex_action_67 :: AlexAction
alex_action_63 = startcode 0 (to octal)
alex_action_68 :: AlexAction
alex_action_64 = startcode 0 (to hex)
alex_action_69 :: AlexAction
alex_action_65 = startcode 0 (to xz)
alex_action_70 :: AlexAction
alex_action_66 = startcode 0 (to decimal)
alex_action_71 :: AlexAction
alex_action_67 = Token -> AlexAction
tok SymParenL
alex_action_72 :: AlexAction
alex_action_68 = Token -> AlexAction
tok SymParenR
alex_action_73 :: AlexAction
alex_action_69 = Token -> AlexAction
tok SymDash
alex_action_74 :: AlexAction
alex_action_70 = tok SymColon
alex_action_75 :: AlexAction
alex_action_71 = tok SymSemi
alex_action_76 :: AlexAction
alex_action_72 = tok SymComma
alex_action_77 :: AlexAction
alex_action_73 = tok SymBrackL
alex_action_78 :: AlexAction
alex_action_74 = startcode 0 (tok SymBrackR)
alex_action_79 :: AlexAction
alex_action_75 = to edgeDesc
alex_action_76 = to tableOut
alex_action_77 = to tableIn
alex_action_78 = to tableEdge
alex_action_79 = startcode 0 (tok KWEndtable)

#define ALEX_GHC 1
#define ALEX_LATIN1 1
#define ALEX_NOPRED 1
-- -----------------------------------------------------------------------------
-- ALEX TEMPLATE
--
-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
-- it for any purpose whatsoever.

-- -----------------------------------------------------------------------------
-- INTERNALS and main scanner engine

#ifdef ALEX_GHC
#  define ILIT(n) n#
#  define IBOX(n) (I# (n))
#  define FAST_INT Int#
-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
#  if __GLASGOW_HASKELL__ > 706
#    define GTE(n,m) (tagToEnum# (n >=# m))
#    define EQ(n,m) (tagToEnum# (n ==# m))
#  else
#    define GTE(n,m) (n >=# m)
#    define EQ(n,m) (n ==# m)
#  endif
#  define PLUS(n,m) (n +# m)
#  define MINUS(n,m) (n -# m)
#  define TIMES(n,m) (n *# m)
#  define NEGATE(n) (negateInt# (n))
#  define IF_GHC(x) (x)
#else
#  define ILIT(n) (n)
#  define IBOX(n) (n)
#  define FAST_INT Int
#  define GTE(n,m) (n >= m)
#  define EQ(n,m) (n == m)
#  define PLUS(n,m) (n + m)
#  define MINUS(n,m) (n - m)
#  define TIMES(n,m) (n * m)
#  define NEGATE(n) (negate (n))
#  define IF_GHC(x)
#endif

#ifdef ALEX_GHC
data AlexAddr = AlexA# Addr#
-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.
#if __GLASGOW_HASKELL__ < 503
uncheckedShiftL# = shiftL#
#endif

{-# INLINE alexIndexInt16OffAddr #-}
alexIndexInt16OffAddr :: AlexAddr -> Int# -> Int#
alexIndexInt16OffAddr (AlexA# arr) off =
#ifdef WORDS_BIGENDIAN
  narrow16Int# i
  where
        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
        low  = int2Word# (ord# (indexCharOffAddr# arr off'))
        off' = off *# 2#
#else
#if __GLASGOW_HASKELL__ >= 901
  int16ToInt#
#endif
    (indexInt16OffAddr# arr off)
#endif
#else
alexIndexInt16OffAddr arr off = arr ! off
#endif

#ifdef ALEX_GHC
{-# INLINE alexIndexInt32OffAddr #-}
alexIndexInt32OffAddr :: AlexAddr -> Int# -> Int#
alexIndexInt32OffAddr (AlexA# arr) off =
#ifdef WORDS_BIGENDIAN
  narrow32Int# i
  where
   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
                     (b2 `uncheckedShiftL#` 16#) `or#`
                     (b1 `uncheckedShiftL#` 8#) `or#` b0)
   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
   off' = off *# 4#
#else
#if __GLASGOW_HASKELL__ >= 901
  int32ToInt#
#endif
    (indexInt32OffAddr# arr off)
#endif
#else
alexIndexInt32OffAddr arr off = arr ! off
#endif

#ifdef ALEX_GHC

#if __GLASGOW_HASKELL__ < 503
quickIndex arr i = arr ! i
#else
-- GHC >= 503, unsafeAt is available from Data.Array.Base.
quickIndex = unsafeAt
#endif
#else
quickIndex arr i = arr ! i
#endif

-- -----------------------------------------------------------------------------
-- Main lexing routines

data AlexReturn a
  = AlexEOF
  | AlexError  !AlexInput
  | AlexSkip   !AlexInput !Int
  | AlexToken  !AlexInput !Int a

-- alexScan :: AlexInput -> StartCode -> AlexReturn a
alexScan input__ IBOX(sc)
  = alexScanUser undefined input__ IBOX(sc)

alexScanUser user__ input__ IBOX(sc)
  = case alex_scan_tkn user__ input__ ILIT(0) input__ sc AlexNone of
  (AlexNone, input__') ->
    case alexGetByte input__ of
      Nothing ->
#ifdef ALEX_DEBUG
                                   trace ("End of input.") $
#endif
                                   AlexEOF
      Just _ ->
#ifdef ALEX_DEBUG
                                   trace ("Error.") $
#endif
                                   AlexError input__'

  (AlexLastSkip input__'' len, _) ->
#ifdef ALEX_DEBUG
    trace ("Skipping.") $
#endif
    AlexSkip input__'' len

  (AlexLastAcc k input__''' len, _) ->
#ifdef ALEX_DEBUG
    trace ("Accept.") $
#endif
    AlexToken input__''' len (alex_actions ! k)


-- Push the input through the DFA, remembering the most recent accepting
-- state it encountered.

alex_scan_tkn user__ orig_input len input__ s last_acc =
  input__ `seq` -- strict in the input
  let
  new_acc = (check_accs (alex_accept `quickIndex` IBOX(s)))
  in
  new_acc `seq`
  case alexGetByte input__ of
     Nothing -> (new_acc, input__)
     Just (c, new_input) ->
#ifdef ALEX_DEBUG
      trace ("State: " ++ show IBOX(s) ++ ", char: " ++ show c) $
#endif
      case fromIntegral c of { IBOX(ord_c) ->
        let
                base   = alexIndexInt32OffAddr alex_base s
                offset = PLUS(base,ord_c)

                new_s = if GTE(offset,ILIT(0))
                          && let check  = alexIndexInt16OffAddr alex_check offset
                             in  EQ(check,ord_c)
                          then alexIndexInt16OffAddr alex_table offset
                          else alexIndexInt16OffAddr alex_deflt s
        in
        case new_s of
            ILIT(-1) -> (new_acc, input__)
                -- on an error, we want to keep the input *before* the
                -- character that failed, not after.
            _ -> alex_scan_tkn user__ orig_input
#ifdef ALEX_LATIN1
                   PLUS(len,ILIT(1))
                   -- issue 119: in the latin1 encoding, *each* byte is one character
#else
                   (if c < 0x80 || c >= 0xC0 then PLUS(len,ILIT(1)) else len)
                   -- note that the length is increased ONLY if this is the 1st byte in a char encoding)
#endif
                   new_input new_s new_acc
      }
  where
        check_accs (AlexAccNone) = last_acc
        check_accs (AlexAcc a  ) = AlexLastAcc a input__ IBOX(len)
        check_accs (AlexAccSkip) = AlexLastSkip  input__ IBOX(len)
#ifndef ALEX_NOPRED
        check_accs (AlexAccPred a predx rest)
           | predx user__ orig_input IBOX(len) input__
           = AlexLastAcc a input__ IBOX(len)
           | otherwise
           = check_accs rest
        check_accs (AlexAccSkipPred predx rest)
           | predx user__ orig_input IBOX(len) input__
           = AlexLastSkip input__ IBOX(len)
           | otherwise
           = check_accs rest
#endif

data AlexLastAcc
  = AlexNone
  | AlexLastAcc !Int !AlexInput !Int
  | AlexLastSkip     !AlexInput !Int

data AlexAcc user
  = AlexAccNone
  | AlexAcc Int
  | AlexAccSkip
#ifndef ALEX_NOPRED
  | AlexAccPred Int (AlexAccPred user) (AlexAcc user)
  | AlexAccSkipPred (AlexAccPred user) (AlexAcc user)

type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool

-- -----------------------------------------------------------------------------
-- Predicates on a rule

alexAndPred p1 p2 user__ in1 len in2
  = p1 user__ in1 len in2 && p2 user__ in1 len in2

--alexPrevCharIsPred :: Char -> AlexAccPred _
alexPrevCharIs c _ input__ _ _ = c == alexInputPrevChar input__

alexPrevCharMatches f _ input__ _ _ = f (alexInputPrevChar input__)

--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _
alexPrevCharIsOneOf arr _ input__ _ _ = arr ! alexInputPrevChar input__

--alexRightContext :: Int -> AlexAccPred _
alexRightContext IBOX(sc) user__ _ _ input__ =
     case alex_scan_tkn user__ input__ ILIT(0) input__ sc AlexNone of
          (AlexNone, _) -> False
          _ -> True
        -- TODO: there's no need to find the longest
        -- match when checking the right context, just
        -- the first match will do.
#endif
{-# LINE 190 "src/Verismith/Verilog2005/Lexer.x" #-}
-- not using any wrapper so I have to define things myself

data AlexInput = AlexInput
  { _aiPosition  :: !Position,
    _aiPrevChar  :: !Char,
    _aiInput     :: !LBS.ByteString
  }

alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)
alexGetByte (AlexInput (Position ln cl s) _ inp) = case LBS.uncons inp of
  Nothing -> Nothing
  Just (b, inp) -> Just (b, let c = w2c b in AlexInput
      ( case c of
          '\t' -> Position ln ((cl .|. 3) + 1) s
          '\n' -> Position (ln + 1) 1 s
          _ -> Position ln (cl + 1) s
      )
      c
      inp
    )

alexInputPrevChar :: AlexInput -> Char
alexInputPrevChar = _aiPrevChar

-- above was mandatory declarations for alex, below is the interesting stuff

data VerilogVersion = SV2023 | SV2017 | SV2012 | SV2009 | SV2005 | V2005 | V2001 | V2001_nc | V1995

instance Show VerilogVersion where
  show x = case x of
    SV2023 -> "1800-2023"
    SV2017 -> "1800-2017"
    SV2012 -> "1800-2012"
    SV2009 -> "1800-2009"
    SV2005 -> "1800-2005"
    V2005 -> "1364-2005"
    V2001 -> "1364-2001"
    V2001_nc -> "1364-2001-noconfig"
    V1995 -> "1364-1995"

data AlexState = AlexState
  { _asStartCode  :: !Int,
    _asInput      :: !AlexInput,
    _asKeywords   :: ![(NonEmpty Position, VerilogVersion)],
    -- LATER: User defined compiler directives support, the value (as in key/value) type is wrong
    _asDefines    :: !(HashMap.HashMap SBS.ByteString LBS.ByteString),
    _asSavedInput :: ![(Position, LBS.ByteString)]
  }

type Alex = StateT AlexState (ExceptT String IO)

scan :: Alex (Maybe PosToken)
scan = get >>= \(AlexState sc inp kw d si) -> case alexScan inp sc of
  AlexEOF -> case si of
    (p, i) : t -> put (AlexState sc (AlexInput p (_aiPrevChar inp) i) kw d t) >> scan
    [] -> case kw of
      [] -> return Nothing
      (p, vv) : _ ->
        throwError $
          printf "Missing `end_keywords to match `begin_keywords %s at %s" (show vv) $
            helperShowPositions p
  AlexError (AlexInput p pc i) ->
    throwError $
      printf
        "lexical error between %s and %s"
        (show $ _aiPosition inp)
        (helperShowPositions $ p :| map fst si)
  AlexSkip inp' _ -> modify' (\s -> s { _asInput = inp' }) >> scan
  AlexToken inp' n action -> do
    modify' $ \s -> s { _asInput = inp' }
    action (_aiPosition inp) $ LBS.toStrict $ LBS.take (toEnum n) $ _aiInput inp

scanTokens :: String -> IO (Either String [PosToken])
scanTokens f = do
  inp <- LBS.readFile f
  runExceptT $
    evalStateT loop $
      AlexState 0 (AlexInput (Position 1 1 $ PSFile f) '\n' inp) [] HashMap.empty []
  where
    loop = scan >>= maybe (pure []) (\x -> (x :) <$> loop)

type AlexAction = Position -> SBS.ByteString -> Alex (Maybe PosToken)

mkPos :: Position -> Token -> Alex (Maybe PosToken)
mkPos p t = (\l -> Just $ PosToken (p :| map fst l) t) <$> gets _asSavedInput

tok :: Token -> AlexAction
tok t p _ = mkPos p t

to :: (SBS.ByteString -> Token) -> AlexAction
to f p = mkPos p . f

toa :: (SBS.ByteString -> Alex Token) -> AlexAction
toa f p s = f s >>= mkPos p

sc :: Int -> Alex ()
sc n = modify' $ \s -> s { _asStartCode = n }

startcode :: Int -> AlexAction -> AlexAction
startcode n f p s = sc n >> f p s

alexPosError :: (NonEmpty Position) -> String -> Alex a
alexPosError p s =
  throwError $ s ++ " at " ++ helperShowPositions p

alexError :: Position -> String -> Alex a
alexError p s = gets _asSavedInput >>= flip alexPosError s . (p :|) . map fst

-- Lexer actions

tsValue :: SBS.ByteString -> Token
tsValue s = CDTSInt (SBS.length s - 1)

tsUnit :: SBS.ByteString -> Token
tsUnit s =
  CDTSUnit $
    case s of "s" -> 0 ; "ms" -> -3 ; "us" -> -6 ; "ns" -> -9 ; "ps" -> -12 ; "fs" -> -15

numberBase :: Base -> SBS.ByteString -> Alex Token
numberBase ba bs = do
  sc (case ba of BBin -> pre2 ; BOct -> pre8 ; BDec -> pre10 ; BHex -> pre16)
  return $ NumberBase (SBS.length bs == 3) ba

binary :: SBS.ByteString -> Token
binary s = LitBinary $ mapMaybe (\c -> case c of
  '0' -> Just BXZ0
  '1' -> Just BXZ1
  'x' -> Just BXZX
  'X' -> Just BXZX
  'z' -> Just BXZZ
  'Z' -> Just BXZZ
  '?' -> Just BXZZ
  _ -> Nothing) $ unpackChars s

octal :: SBS.ByteString -> Token
octal s = LitOctal $ mapMaybe (\c -> case c of
  'x' -> Just OXZX
  'X' -> Just OXZX
  'z' -> Just OXZZ
  'Z' -> Just OXZZ
  '?' -> Just OXZZ
  _ | '0' <= c && c <= '7' -> Just $ toEnum $ fromEnum c - fromEnum '0'
  _ -> Nothing) $ unpackChars s

hex :: SBS.ByteString -> Token
hex s = LitHex $ mapMaybe (\c -> case c of
  'x' -> Just HXZX
  'X' -> Just HXZX
  'z' -> Just HXZZ
  'Z' -> Just HXZZ
  '?' -> Just HXZZ
  _ | '0' <= c && c <= '9' -> Just $ toEnum $ fromEnum c - fromEnum '0'
  _ | 'a' <= c && c <= 'f' -> Just $ toEnum $ fromEnum c + 10 - fromEnum 'a'
  _ | 'A' <= c && c <= 'F' -> Just $ toEnum $ fromEnum c + 10 - fromEnum 'A'
  _ -> Nothing) $ unpackChars s

xz :: SBS.ByteString -> Token
xz s = LitXZ $ let c = SBS.head s in c == c2w 'x' || c == c2w 'X'

parseDecimal :: SBS.ByteString -> Natural
parseDecimal =
  fromInteger . SBS.foldl
    (\acc d -> if c2w '0' <= d && d <= c2w '9' then 10*acc + toInteger (d - c2w '0') else acc)
    0

decimal :: SBS.ByteString -> Token
decimal = LitDecimal . parseDecimal

unbxz :: SBS.ByteString -> BXZ
unbxz s = case s of "0" -> BXZ0; "1" -> BXZ1; "x" -> BXZX; "X" -> BXZX; "z" -> BXZZ; "Z" -> BXZZ

edgeDesc :: SBS.ByteString -> Token
edgeDesc s = EdgeEdge (unbxz $ SBS.init s) (unbxz $ SBS.tail s)

tableOut :: SBS.ByteString -> Token
tableOut s = TableOut $ case s of "0" -> ZOXZ; "1" -> ZOXO; "x" -> ZOXX; "X" -> ZOXX

tableIn :: SBS.ByteString -> Token
tableIn s = TableIn $ case s of "b" -> True; "B" -> True; "?" -> False

tableEdge :: SBS.ByteString -> Token
tableEdge s =
  TableEdge $ case s of
    "*" -> AFRNPA
    "f" -> AFRNPF
    "F" -> AFRNPF
    "r" -> AFRNPR
    "R" -> AFRNPR
    "n" -> AFRNPN
    "N" -> AFRNPN
    "p" -> AFRNPP
    "P" -> AFRNPP

cdcident :: AlexAction
cdcident p s = case HashMap.lookup (SBS.tail s) cdMap of
  Just a -> a p
  Nothing -> do
    defs <- gets _asDefines
    case HashMap.lookup s defs of
      Nothing ->
        alexError p $
          printf "Compiler directive %s not declared nor supported, preprocess input file" $
            show s
      Just i ->
        alexError p $
          printf
            "User defined compiler directive replacement in not implemented, %s was encountered"
            (show s)

kwident :: SBS.ByteString -> Alex Token
kwident s = case SBS.stripPrefix "PATHPULSE$" s of
  Just ss -> return $ TknPP ss
  Nothing -> do
    vv <- gets _asKeywords
    let m = HashMap.lookup s $ case vv of
          (_, V1995) : _ -> kwV1995Map
          (_, V2001) : _ -> kwV2001Map
          (_, V2001_nc) : _ -> kwV2001NCMap
          (_, SV2005) : _ -> kwSV2005Map
          (_, SV2009) : _ -> kwSV2009Map
          (_, SV2012) : _ -> kwSV2012Map
          (_, SV2017) : _ -> kwSV2012Map
          (_, SV2023) : _ -> kwSV2012Map
          _ -> kwV2005Map
    case m of
      Nothing -> return $ if isKW s then IdEscaped $ SBS.cons (c2w '\\') s else IdSimple s
      Just act -> act

isIdentSimple :: SBS.ByteString -> Bool
isIdentSimple s = case SBS.uncons s of
  Just (c, t) ->
    testfirst c
      && not (isKW s)
      && SBS.all (\c -> testfirst c || (c2w '0' <= c && c <= c2w '9') || c == c2w '$') t
  _ -> False
  where
    testfirst c = (c2w 'A' <= c && c <= c2w 'Z') || (c2w 'a' <= c && c <= c2w 'z') || c == c2w '_'

escSimpleIdent :: SBS.ByteString -> Token
escSimpleIdent s = if isIdentSimple s then IdSimple s else IdEscaped s

makeString :: String -> SBS.ByteString
makeString s = packChars $ concatMap esc s
  where esc c = case w2c $ c2w c of '"' -> "\\\""; '\\' -> "\\\\"; '\n' -> "\\n"; x -> [x]

cdMap :: HashMap.HashMap SBS.ByteString (Position -> Alex (Maybe PosToken))
cdMap = HashMap.fromList $
  ("include", includecompdir)
  -- LATER: `define would go here and change state to store input as is in _asDefines
  : ("line", linecompdir)
  : ("begin_keywords", beginkwcompdir)
  : ("end_keywords", endkwcompdir)
  : ("undefineall", \_ -> modify' (\s -> s { _asDefines = HashMap.empty }) >> scan)
  : ("__LINE__", \p -> mkPos p $ LitString $ packChars $ show $ _posLine p)
  : ("__FILE__", \p -> mkPos p $ LitString $ makeString $ show $ _posSource p)
  : map (\(x, y) -> (x, \p -> y >>= mkPos p))
    ( ("timescale", sc ts0 >> return CDTimescale)
      : ("resetall", modify' (\s -> s { _asDefines = HashMap.empty }) >> return CDResetall)
      -- , ("pragma", >> return CDPragma) -- TODO: Another layer of hell
      : map (\(x, y) -> (x, return y))
        [ ("celldefine", CDCelldefine)
        , ("default_nettype", CDDefaultnettype)
        -- , ("default_decay_time", CDUnknown)
        -- , ("default_trireg_strength", CDUnknown)
        -- , ("delay_mode_distributed", CDUnknown)
        -- , ("delay_mode_path", CDUnknown)
        -- , ("delay_mode_unit", CDUnknown)
        -- , ("delay_mode_zero", CDUnknown)
        , ("endcelldefine", CDEndcelldefine)
        , ("nounconnected_drive", CDNounconnecteddrive)
        , ("unconnected_drive", CDUnconnecteddrive)
        ]
    )

includecompdir :: Position -> Alex (Maybe PosToken)
includecompdir _ = do
  oldsc <- gets _asStartCode
  sc 0
  t <- scan
  case t of
    Nothing -> return Nothing
    Just (PosToken _ (LitString s)) -> do
      let f = unpackChars s
      -- LATER: search for file
      i <- liftIO $ LBS.readFile f
      modify' $ \(AlexState _ (AlexInput p pc bs) kw d si) ->
        AlexState oldsc (AlexInput (Position 1 1 $ PSFile f) pc i) kw d $ (p, bs) : si
      scan
    Just (PosToken p _) -> alexPosError p "Expected a filename to include"

linecompdir :: Position -> Alex (Maybe PosToken)
linecompdir _ = do
  oldsc <- gets _asStartCode
  sc 0
  l <- scan
  f <- scan
  c <- scan
  case l >>= \ll -> f >>= \ff -> c >>= \cc -> pure (ll, ff, cc) of
    Nothing -> return Nothing
    Just (PosToken _ (LitDecimal l), PosToken _ (LitString s), PosToken _ (LitDecimal n))
      | n < 3 -> do
        modify' $ \(AlexState _ (AlexInput p pc bs) kw d si) ->
          AlexState
            oldsc
            (AlexInput (Position (naturalToWord l - 1) 1 $ PSLine (unpackChars s) (n == 1)) pc bs)
            kw
            d
            ((p, "") : if n /= 2 then si else smashline si)
        scan
    Just (PosToken _ (LitDecimal _), PosToken _ (LitString _), PosToken p _) ->
      alexPosError p "Expected a number between 0 and 2 to override position"
    Just (PosToken _ (LitDecimal _), PosToken p _, _) ->
      alexPosError p "Expected a filename and a number between 0 and 2 to override position"
    Just (PosToken p _, _, _) ->
      alexPosError
        p
        "Expected a number, a filename and a number between 0 and 2 to override position"
  where
    smashline l =
      case dropWhile (\(p, _) -> case _posSource p of PSLine _ b -> not b; _ -> False) l of
        (Position _ _ (PSLine _ True), _) : t -> t
        ll -> ll

beginkwcompdir :: Position -> Alex (Maybe PosToken)
beginkwcompdir _ = do
  oldsc <- gets _asStartCode
  sc 0
  t <- scan
  case t of
    Nothing -> return Nothing
    Just (PosToken p (LitString s)) -> case versionFromString s of
      Nothing -> alexPosError p "Expected a standard number string (ex. 1364-2005)"
      Just vv -> do
        modify' $ \(AlexState _ i kw d si) -> AlexState oldsc i ((p, vv) : kw) d si
        return $ Just $ PosToken p CDBeginKeywords
    Just (PosToken p _) -> alexPosError p "Expected a standard number string (ex. 1364-2005)"
  where
    versionFromString s = case splitAt 5 $ unpackChars s of
      ("1800-", '2' : '0' : year) -> case year of
        "05" -> Just SV2005
        "09" -> Just SV2009
        "12" -> Just SV2012
        "17" -> Just SV2017
        "23" -> Just SV2023
        _ -> Nothing
      ("1364-", year) -> case year of
        "1995" -> Just V1995
        "2001" -> Just V2001
        "2001-noconfig" -> Just V2001_nc
        "2005" -> Just V2005
        _ -> Nothing
      _ -> Nothing

endkwcompdir :: Position -> Alex (Maybe PosToken)
endkwcompdir p = do
  mkw <- gets _asKeywords
  case mkw of
    [] -> alexError p "`end_kewords encountered without a previous matching `begin_keywords"
    _ : kw -> modify' (\s -> s { _asKeywords = kw }) >> mkPos p CDEndKeywords

isKW :: SBS.ByteString -> Bool
isKW s = HashMap.member s kwSV2012Map

kwV1995 :: [(SBS.ByteString, Alex Token)]
kwV1995 =
  [ ("always", pure KWAlways),
    ("and", pure KWAnd),
    ("assign", pure KWAssign),
    ("begin", pure KWBegin),
    ("buf", pure KWBuf),
    ("bufif0", pure KWBufif0),
    ("bufif1", pure KWBufif1),
    ("case", pure KWCase),
    ("casex", pure KWCasex),
    ("casez", pure KWCasez),
    ("cmos", pure KWCmos),
    ("deassign", pure KWDeassign),
    ("default", pure KWDefault),
    ("defparam", pure KWDefparam),
    ("disable", pure KWDisable),
    ("edge", sc edge >> pure KWEdge),
    ("else", pure KWElse),
    ("end", pure KWEnd),
    ("endcase", pure KWEndcase),
    ("endfunction", pure KWEndfunction),
    ("endmodule", pure KWEndmodule),
    ("endprimitive", pure KWEndprimitive),
    ("endspecify", pure KWEndspecify),
    ("endtable", sc 0 >> pure KWEndtable),
    ("endtask", pure KWEndtask),
    ("event", pure KWEvent),
    ("for", pure KWFor),
    ("force", pure KWForce),
    ("forever", pure KWForever),
    ("fork", pure KWFork),
    ("function", pure KWFunction),
    ("highz0", pure KWHighz0),
    ("highz1", pure KWHighz1),
    ("if", pure KWIf),
    ("ifnone", pure KWIfnone),
    ("initial", pure KWInitial),
    ("inout", pure KWInout),
    ("input", pure KWInput),
    ("integer", pure KWInteger),
    ("join", pure KWJoin),
    ("large", pure KWLarge),
    ("macromodule", pure KWMacromodule),
    ("medium", pure KWMedium),
    ("module", pure KWModule),
    ("nand", pure KWNand),
    ("negedge", pure KWNegedge),
    ("nmos", pure KWNmos),
    ("nor", pure KWNor),
    ("not", pure KWNot),
    ("notif0", pure KWNotif0),
    ("notif1", pure KWNotif1),
    ("or", pure KWOr),
    ("output", pure KWOutput),
    ("parameter", pure KWParameter),
    ("pmos", pure KWPmos),
    ("posedge", pure KWPosedge),
    ("primitive", pure KWPrimitive),
    ("pull0", pure KWPull0),
    ("pull1", pure KWPull1),
    ("pulldown", pure KWPulldown),
    ("pullup", pure KWPullup),
    ("rcmos", pure KWRcmos),
    ("real", pure KWReal),
    ("realtime", pure KWRealtime),
    ("reg", pure KWReg),
    ("release", pure KWRelease),
    ("repeat", pure KWRepeat),
    ("rnmos", pure KWRnmos),
    ("rpmos", pure KWRpmos),
    ("rtran", pure KWRtran),
    ("rtranif0", pure KWRtranif0),
    ("rtranif1", pure KWRtranif1),
    ("scalared", pure KWScalared),
    ("small", pure KWSmall),
    ("specify", pure KWSpecify),
    ("specparam", pure KWSpecparam),
    ("strong0", pure KWStrong0),
    ("strong1", pure KWStrong1),
    ("supply0", pure KWSupply0),
    ("supply1", pure KWSupply1),
    ("table", sc table >> pure KWTable),
    ("task", pure KWTask),
    ("time", pure KWTime),
    ("tran", pure KWTran),
    ("tranif0", pure KWTranif0),
    ("tranif1", pure KWTranif1),
    ("tri", pure KWTri),
    ("tri0", pure KWTri0),
    ("tri1", pure KWTri1),
    ("triand", pure KWTriand),
    ("trior", pure KWTrior),
    ("trireg", pure KWTrireg),
    ("vectored", pure KWVectored),
    ("wait", pure KWWait),
    ("wand", pure KWWand),
    ("weak0", pure KWWeak0),
    ("weak1", pure KWWeak1),
    ("while", pure KWWhile),
    ("wire", pure KWWire),
    ("wor", pure KWWor),
    ("xnor", pure KWXnor),
    ("xor", pure KWXor)
  ]

kwV2001_nc :: [(SBS.ByteString, Alex Token)]
kwV2001_nc =
  ("automatic", pure KWAutomatic)
  : ("endgenerate", pure KWEndgenerate)
  : ("generate", pure KWGenerate)
  : ("genvar", pure KWGenvar)
  : ("localparam", pure KWLocalparam)
  : ("noshowcancelled", pure KWNoshowcancelled)
  : ("pulsestyle_ondetect", pure KWPulsestyleondetect)
  : ("pulsestyle_onevent", pure KWPulsestyleonevent)
  : ("showcancelled", pure KWShowcancelled)
  : ("signed", pure KWSigned)
  : ("unsigned", pure KWUnsigned)
  : kwV1995

kwV2001 :: [(SBS.ByteString, Alex Token)]
kwV2001 =
  ("cell", pure KWCell)
  : ("config", pure KWConfig)
  : ("design", pure KWDesign)
  : ("endconfig", pure KWEndconfig)
  : ("incdir", pure KWIncdir)
  : ("include", pure KWInclude)
  : ("instance", pure KWInstance)
  : ("liblist", pure KWLiblist)
  : ("library", pure KWLibrary)
  : ("use", pure KWUse)
  : kwV2001_nc

kwV2005 :: [(SBS.ByteString, Alex Token)]
kwV2005 =
  ("uwire", pure KWUwire)
  : kwV2001

kwSV2005 :: [(SBS.ByteString, Alex Token)]
kwSV2005 =
  ("alias", pure $ TokSVKeyword "alias")
  : ("always_comb", pure $ TokSVKeyword "always_comb")
  : ("always_ff", pure $ TokSVKeyword "always_ff")
  : ("always_latch", pure $ TokSVKeyword "always_latch")
  : ("assert", pure $ TokSVKeyword "assert")
  : ("assume", pure $ TokSVKeyword "assume")
  : ("before", pure $ TokSVKeyword "before")
  : ("bind", pure $ TokSVKeyword "bind")
  : ("bins", pure $ TokSVKeyword "bins")
  : ("binsof", pure $ TokSVKeyword "binsof")
  : ("bit", pure $ TokSVKeyword "bit")
  : ("break", pure $ TokSVKeyword "break")
  : ("byte", pure $ TokSVKeyword "byte")
  : ("chandle", pure $ TokSVKeyword "chandle")
  : ("class", pure $ TokSVKeyword "class")
  : ("clocking", pure $ TokSVKeyword "clocking")
  : ("const", pure $ TokSVKeyword "const")
  : ("constraint", pure $ TokSVKeyword "constraint")
  : ("context", pure $ TokSVKeyword "context")
  : ("continue", pure $ TokSVKeyword "continue")
  : ("cover", pure $ TokSVKeyword "cover")
  : ("covergroup", pure $ TokSVKeyword "covergroup")
  : ("coverpoint", pure $ TokSVKeyword "coverpoint")
  : ("cross", pure $ TokSVKeyword "cross")
  : ("dist", pure $ TokSVKeyword "dist")
  : ("do", pure $ TokSVKeyword "do")
  : ("endclass", pure $ TokSVKeyword "endclass")
  : ("endclocking", pure $ TokSVKeyword "endclocking")
  : ("endgroup", pure $ TokSVKeyword "endgroup")
  : ("endinterface", pure $ TokSVKeyword "endinterface")
  : ("endpackage", pure $ TokSVKeyword "endpackage")
  : ("endprogram", pure $ TokSVKeyword "endprogram")
  : ("endproperty", pure $ TokSVKeyword "endproperty")
  : ("endsequence", pure $ TokSVKeyword "endsequence")
  : ("enum", pure $ TokSVKeyword "enum")
  : ("expect", pure $ TokSVKeyword "expect")
  : ("export", pure $ TokSVKeyword "export")
  : ("extends", pure $ TokSVKeyword "extends")
  : ("extern", pure $ TokSVKeyword "extern")
  : ("final", pure $ TokSVKeyword "final")
  : ("first_match", pure $ TokSVKeyword "first_match")
  : ("foreach", pure $ TokSVKeyword "foreach")
  : ("forkjoin", pure $ TokSVKeyword "forkjoin")
  : ("iff", pure $ TokSVKeyword "iff")
  : ("ignore_bins", pure $ TokSVKeyword "ignore_bins")
  : ("illegal_bins", pure $ TokSVKeyword "illegal_bins")
  : ("import", pure $ TokSVKeyword "import")
  : ("inside", pure $ TokSVKeyword "inside")
  : ("int", pure $ TokSVKeyword "int")
  : ("interface", pure $ TokSVKeyword "interface")
  : ("intersect", pure $ TokSVKeyword "intersect")
  : ("join_any", pure $ TokSVKeyword "join_any")
  : ("join_none", pure $ TokSVKeyword "join_none")
  : ("local", pure $ TokSVKeyword "local")
  : ("logic", pure $ TokSVKeyword "logic")
  : ("longint", pure $ TokSVKeyword "longint")
  : ("matches", pure $ TokSVKeyword "matches")
  : ("modport", pure $ TokSVKeyword "modport")
  : ("new", pure $ TokSVKeyword "new")
  : ("null", pure $ TokSVKeyword "null")
  : ("package", pure $ TokSVKeyword "package")
  : ("packed", pure $ TokSVKeyword "packed")
  : ("priority", pure $ TokSVKeyword "priority")
  : ("program", pure $ TokSVKeyword "program")
  : ("property", pure $ TokSVKeyword "property")
  : ("protected", pure $ TokSVKeyword "protected")
  : ("pure", pure $ TokSVKeyword "pure")
  : ("rand", pure $ TokSVKeyword "rand")
  : ("randc", pure $ TokSVKeyword "randc")
  : ("randcase", pure $ TokSVKeyword "randcase")
  : ("randsequence", pure $ TokSVKeyword "randsequence")
  : ("ref", pure $ TokSVKeyword "ref")
  : ("return", pure $ TokSVKeyword "return")
  : ("sequence", pure $ TokSVKeyword "sequence")
  : ("shortint", pure $ TokSVKeyword "shortint")
  : ("shortreal", pure $ TokSVKeyword "shortreal")
  : ("solve", pure $ TokSVKeyword "solve")
  : ("static", pure $ TokSVKeyword "static")
  : ("string", pure $ TokSVKeyword "string")
  : ("struct", pure $ TokSVKeyword "struct")
  : ("super", pure $ TokSVKeyword "super")
  : ("tagged", pure $ TokSVKeyword "tagged")
  : ("this", pure $ TokSVKeyword "this")
  : ("throughout", pure $ TokSVKeyword "throughout")
  : ("timeprecision", pure $ TokSVKeyword "timeprecision")
  : ("timeunit", pure $ TokSVKeyword "timeunit")
  : ("type", pure $ TokSVKeyword "type")
  : ("typedef", pure $ TokSVKeyword "typedef")
  : ("union", pure $ TokSVKeyword "union")
  : ("unique", pure $ TokSVKeyword "unique")
  : ("var", pure $ TokSVKeyword "var")
  : ("virtual", pure $ TokSVKeyword "virtual")
  : ("void", pure $ TokSVKeyword "void")
  : ("wait_order", pure $ TokSVKeyword "wait_order")
  : ("wildcard", pure $ TokSVKeyword "wildcard")
  : ("with", pure $ TokSVKeyword "with")
  : ("within", pure $ TokSVKeyword "within")
  : kwV2005

kwSV2009 :: [(SBS.ByteString, Alex Token)]
kwSV2009 =
  ("accept_on", pure $ TokSVKeyword "accept_on")
  : ("checker", pure $ TokSVKeyword "checker")
  : ("endchecker", pure $ TokSVKeyword "endchecker")
  : ("eventually", pure $ TokSVKeyword "eventually")
  : ("global", pure $ TokSVKeyword "global")
  : ("implies", pure $ TokSVKeyword "implies")
  : ("let", pure $ TokSVKeyword "let")
  : ("nexttime", pure $ TokSVKeyword "nexttime")
  : ("reject_on", pure $ TokSVKeyword "reject_on")
  : ("restrict", pure $ TokSVKeyword "restrict")
  : ("s_always", pure $ TokSVKeyword "s_always")
  : ("s_eventually", pure $ TokSVKeyword "s_eventually")
  : ("s_nexttime", pure $ TokSVKeyword "s_nexttime")
  : ("s_until", pure $ TokSVKeyword "s_until")
  : ("s_until_with", pure $ TokSVKeyword "s_until_with")
  : ("strong", pure $ TokSVKeyword "strong")
  : ("sync_accept_on", pure $ TokSVKeyword "sync_accept_on")
  : ("sync_reject_on", pure $ TokSVKeyword "sync_reject_on")
  : ("unique0", pure $ TokSVKeyword "unique0")
  : ("until", pure $ TokSVKeyword "until")
  : ("until_with", pure $ TokSVKeyword "until_with")
  : ("untyped", pure $ TokSVKeyword "untyped")
  : ("weak", pure $ TokSVKeyword "weak")
  : kwSV2005

kwSV2012 :: [(SBS.ByteString, Alex Token)]
kwSV2012 =
  ("implements", pure $ TokSVKeyword "implements")
  : ("interconnect", pure $ TokSVKeyword "interconnect")
  : ("nettype", pure $ TokSVKeyword "nettype")
  : ("soft", pure $ TokSVKeyword "soft")
  : kwSV2009

kwV1995Map :: HashMap.HashMap SBS.ByteString (Alex Token)
kwV1995Map = HashMap.fromList kwV1995

kwV2001Map :: HashMap.HashMap SBS.ByteString (Alex Token)
kwV2001Map = HashMap.fromList kwV2001

kwV2001NCMap :: HashMap.HashMap SBS.ByteString (Alex Token)
kwV2001NCMap = HashMap.fromList kwV2001_nc

kwV2005Map :: HashMap.HashMap SBS.ByteString (Alex Token)
kwV2005Map = HashMap.fromList kwV2005

kwSV2005Map :: HashMap.HashMap SBS.ByteString (Alex Token)
kwSV2005Map = HashMap.fromList kwSV2005

kwSV2009Map :: HashMap.HashMap SBS.ByteString (Alex Token)
kwSV2009Map = HashMap.fromList kwSV2009

kwSV2012Map :: HashMap.HashMap SBS.ByteString (Alex Token)
kwSV2012Map = HashMap.fromList kwSV2012