packages feed

GenZ-0.1.0.0: lib/General/Lex.x

{
{-# OPTIONS_GHC -w #-}
{-# OPTIONS_GHC -fno-warn-tabs -fno-warn-missing-signatures #-}
module General.Lex where

import General.Token
}

%wrapper "posn"

$dig = 0-9      -- digits
$alf = [a-zA-Z] -- alphabetic characters

tokens :-
  -- ignore whitespace:
  $white+           ;
  -- ignore the word "begin"
  "begin"           ;
  -- ignore the word "end"
  "end"             ;
  -- keywords and punctuation:
  "("               { \ p _ -> TokenOB                p }
  ")"               { \ p _ -> TokenCB                p }
  -- Formulas:
  "true"            { \ p _ -> TokenTop               p }
  "⊤"               { \ p _ -> TokenTop               p }
  "false"           { \ p _ -> TokenBot               p }
  "⊥"               { \ p _ -> TokenBot               p }
  "~"               { \ p _ -> TokenNeg               p }
  "¬"               { \ p _ -> TokenNeg               p }
  "!"               { \ p _ -> TokenNeg               p }
  "&"               { \ p _ -> TokenCon               p }
  "|"               { \ p _ -> TokenDis               p }
  "v"               { \ p _ -> TokenDis               p }
  "=>"              { \ p _ -> TokenImpl              p }
  "→"               { \ p _ -> TokenImpl              p }
  "->"              { \ p _ -> TokenImpl              p }
  "-->"             { \ p _ -> TokenImpl              p }
  "<->"             { \ p _ -> TokenEqui              p }
  "<=>"             { \ p _ -> TokenEqui              p }
  "<-->"            { \ p _ -> TokenEqui              p }
  "↔"               { \ p _ -> TokenEqui              p }
  "◇"               { \ p _ -> TokenDia               p }
  "♢"               { \ p _ -> TokenDia               p }
  "<"               { \ p _ -> TokenDiaL              p }
  ">"               { \ p _ -> TokenDiaR              p }
  "☐"               { \ p _ -> TokenBox               p }
  "◻"               { \ p _ -> TokenBox               p }
  "□"               { \ p _ -> TokenBox               p }
  "[]"              { \ p _ -> TokenBox               p }
  "["               { \ p _ -> TokenBoxL              p }
  "]"               { \ p _ -> TokenBoxR              p }
  -- Strings:
  [$alf $dig _]+      { \ p s -> TokenString s          p }
  -- Special chars:
  "𝑝"               { \ p _ -> TokenString "p"        p }

{
type LexResult a = Either (Int,Int) a

alexScanTokensSafe :: String -> LexResult [Token AlexPosn]
alexScanTokensSafe str = go (alexStartPos,'\n',[],str) where
  go inp@(pos,_,_,str) =
    case (alexScan inp 0) of
      AlexEOF -> Right []
      AlexError ((AlexPn _ line column),_,_,_) -> Left (line,column)
      AlexSkip  inp' len     -> go inp'
      AlexToken inp' len act -> case (act pos (take len str), go inp') of
        (_, Left lc) -> Left lc
        (x, Right y) -> Right (x : y)
}