packages feed

yi-0.6.2.2: src/Yi/Lexer/Abella.x

-- -*- haskell -*-
--
-- Lexical syntax for Abella
--
-- (c) Nicolas Pouillard 2009
--

{
{-# OPTIONS -w  #-}
module Yi.Lexer.Abella ( initState, alexScanToken, tokenToStyle,
                         tokenToText, TT,
                         isComment, Token(..), HlState, Reserved(..), ReservedOp(..) ) where
import Yi.Lexer.Alex
import Yi.Style
}

$whitechar = [\ \t\n\r\f\v]

$digit  = 0-9

$small     = [a-z]
$large     = [A-Z]
$alpha     = [$small $large]
$idchar    = [$alpha $digit \_ \']

$nl        = [\n\r]

@reservedid =
        Theorem|Define
@reservedop = [\=\:\,\(\)\{\}]

@varid  = $large $idchar*
@conid  = [\' \_ $small] $idchar*
@anyid = (@varid | @conid)

@decimal     = $digit+

abella :-

<0> $white+                                     ;

<0> {
  "%"[^$nl]*                                    { c CommentLine }

  "exists"                                      { c $ Reserved Exists }
  "forall"                                      { c $ Reserved Forall }

  @reservedid                                   { c $ Reserved Other }

  \\                                            { c $ ReservedOp BackSlash }
  \\\/                                          { c $ ReservedOp Or }
  \/\\                                          { c $ ReservedOp And }
  "->"                                          { c $ ReservedOp RightArrow }
  "=>"                                          { c $ ReservedOp DoubleRightArrow }
  "."                                           { c $ ReservedOp Dot }
  @reservedop                                   { c $ ReservedOp OtherOp }

  @decimal                                      { c Number }

  "skip"                                        { c Skip }

  @varid                                        { c VarIdent }
  @conid                                        { c ConsIdent }

  .                                             { c Unrecognized }
}

{

type HlState = Int

data Reserved = Forall | Exists | Other
    deriving (Eq, Show)

data ReservedOp = Or | And | BackSlash | RightArrow | DoubleRightArrow | Dot | OtherOp
    deriving (Eq, Show)

data Token = Number | VarIdent | ConsIdent
           | Reserved !Reserved | ReservedOp !ReservedOp
           | CommentLine | Skip
           | Unrecognized
             deriving (Eq, Show)

tokenToStyle :: Token -> StyleName
tokenToStyle tok = case tok of
  Number         -> numberStyle
  VarIdent       -> variableStyle
  ConsIdent      -> typeStyle
  ReservedOp _   -> operatorStyle
  Reserved _     -> keywordStyle
  CommentLine    -> commentStyle
  Skip           -> errorStyle
  Unrecognized   -> errorStyle

tokenToText :: Token -> Maybe String
tokenToText (ReservedOp RightArrow) = Just "→ "
tokenToText (ReservedOp DoubleRightArrow) = Just "⇒ "
tokenToText (ReservedOp And) = Just "∧ "
tokenToText (ReservedOp Or) = Just "∨ "
tokenToText (Reserved Exists) = Just "∃"
tokenToText (Reserved Forall) = Just "∀"
tokenToText _ = Nothing

isComment CommentLine = True
isComment _ = False

stateToInit = const 0

initState :: HlState
initState = 0

type TT = Tok Token

#include "common.hsinc"
}