packages feed

hylolib-1.3.0: src/HyLo/InputFile/OldLexer.x

{
{-# OPTIONS_GHC -w #-}
module HyLo.InputFile.OldLexer (lexify, Token(..),
                                FilePos, line, col)

where

import Data.Char ( isSpace )

import HyLo.Signature.Simple ( PropSymbol(..),
                               NomSymbol(..),
                               RelSymbol(..), inv )
}

%wrapper "posn"

$digit = [0-9]                  -- digits
$alpha = [a-zA-Z]               -- alphabetic characters
$alphaNum = [$alpha$digit]

@int = \-?$digit+
@rel = [Rr]@int

hyloTokens :-
  $white+                   ;       -- strip whitspaces
  \%.*                      ;       -- strip comments
  \{ (~\} | \n)* \}         ;       -- strip multiple line comments

  begin                     { discardValue TokenBegin }
  end                       { discardValue TokenEnd   }

  true                      { discardValue TokenTrue  }
  false                     { discardValue TokenFalse }
  [Pp]@int                  { storeValue (TokenProp . prop  . tail) }
  [Nn]@int                  { storeValue (TokenNom  . nom   . tail) }
  [Xx]@int                  { storeValue (TokenVar  . var   . tail) }

  \<$white*@rel?$white*\>   { storeValue (TokenDia . rel . dropEnds) }
  dia                       { discardValue (TokenDia defaultRel)     }

  \<$white*\-@rel?$white*\> { storeValue (TokenDia . relI . tail . dropEnds) }

  \[$white*@rel?$white*\]   { storeValue (TokenBox . rel . dropEnds) }
  box                       { discardValue (TokenBox defaultRel)     }

  \[$white*\-@rel?$white*\] { storeValue (TokenBox . relI . tail . dropEnds) }

  \:                        { discardValue TokenAt  }
  \@                        { discardValue TokenAt2 }

  A                         { discardValue TokenUBox }
  E                         { discardValue TokenUDia }

  D                         { discardValue TokenDDia }
  B                         { discardValue TokenDBox }

  down                      { discardValue TokenDown }

  [v\|]                     { discardValue TokenOr   }
  [&\^]                     { discardValue TokenAnd  }
  [\!\-\~]                  { discardValue TokenNeg  }
  "<-->"                    { discardValue TokenDimp }
  "-->"                     { discardValue TokenImp  }
  "->"                      { discardValue TokenImp  }

  "("                       { discardValue TokenOB }
  ")"                       { discardValue TokenCB }

  \.                        { discardValue TokenDot }
  \;                        { discardValue TokenSC }

{
data Token = TokenBegin           | TokenEnd
           | TokenTrue            | TokenFalse
           | TokenProp PropSymbol | TokenNom NomSymbol  | TokenVar NomSymbol
           | TokenNeg             | TokenAnd            | TokenOr
           | TokenAt              | TokenAt2            | TokenDown
           | TokenBox  RelSymbol  | TokenDia  RelSymbol
           | TokenImp             | TokenDimp
           | TokenUBox            | TokenUDia
           | TokenDBox            | TokenDDia
           | TokenOB              | TokenCB
           | TokenDot             | TokenSC
  deriving (Eq, Show, Read)

data FilePos = FP{line :: Int, col :: Int} deriving (Eq, Show)

makeFilePos (AlexPn _ l c) = FP{line = l, col = c}

lexify :: String -> [(Token, FilePos)]
lexify str = go (alexStartPos,'\n',str)
    where go inp@(pos,_,str) = case alexScan inp 0 of
                                    AlexEOF                       -> []
                                    AlexError (AlexPn _ l c, _,_) -> error $ concat ["Unknown token at line: ", show l, " col: ", show c]
                                    AlexSkip  inp' len            -> go inp'
                                    AlexToken inp' len act        -> act pos (take len str) : go inp'

-- for building tokens which hold a value
storeValue     mkToken alexPos v = (mkToken v, makeFilePos alexPos)

-- for building tokens which discard the parsed string
discardValue   token alexPos _ = (token, makeFilePos alexPos)

dropEnds = init . tail

prop   = PropSymbol . read
nom    = N . read
var    = X . read
rel  r
  | null r    = defaultRel
  | otherwise =  RelSymbol (read . tail . dropWhile isSpace $ r)
relI   = inv . rel
defaultRel = RelSymbol 1
}