multifocal-0.0.1: src/Language/TLT/TltLexer.x
{
-----------------------------------------------------------------------------
-- |
-- Module : Language.TLT.TltLexer
-- Copyright : (c) 2011 University of Minho
-- License : BSD3
--
-- Maintainer : hpacheco@di.uminho.pt
-- Stability : experimental
-- Portability : non-portable
--
-- Multifocal:
-- Bidirectional Two-level Transformation of XML Schemas
--
-- Lexer for the two-level language.
--
-----------------------------------------------------------------------------
module Language.TLT.TltLexer where
import Text.ParserCombinators.Parsec (SourcePos)
}
%wrapper "monad"
$digit = 0-9 -- digits
$alpha = [a-zA-Z] -- alphabetic characters
tokens :-
$white+ ;
\"[^\"]*\" { makeAlexAction (\s -> TokString $ tail $ init s) }
\( { makeAlexAction (\s -> TokSym '(') }
\) { makeAlexAction (\s -> TokSym ')') }
"nop" { makeAlexAction (\s -> TokNop) }
">>" { makeAlexAction (\s -> TokComp) }
"||" { makeAlexAction (\s -> TokChoice) }
"try" { makeAlexAction (\s -> TokTry) }
"many" { makeAlexAction (\s -> TokMany) }
"all" { makeAlexAction (\s -> TokAll) }
"once" { makeAlexAction (\s -> TokOnce) }
"everywhere" { makeAlexAction (\s -> TokEverywhere) }
"outermost" { makeAlexAction (\s -> TokOutermost) }
"at" { makeAlexAction (\s -> TokAt) }
"when" { makeAlexAction (\s -> TokWhen) }
"hoist" { makeAlexAction (\s -> TokHoist) }
"plunge" { makeAlexAction (\s -> TokPlunge) }
"rename" { makeAlexAction (\s -> TokRename) }
"erase" { makeAlexAction (\s -> TokErase) }
"select" { makeAlexAction (\s -> TokSelect) }
{
makeAlexAction ::Monad m => (String -> Token) -> AlexInput -> Int -> m Token
makeAlexAction cons = \ (_,_,inp) len ->return $cons (take len inp)
-- | Just to make alexMonadScan work, although we do not use it
alexEOF = return undefined
data Token = TokNop | TokComp | TokChoice | TokTry | TokMany
| TokAll | TokOnce | TokEverywhere | TokOutermost
| TokAt | TokWhen | TokHoist | TokPlunge | TokRename
| TokErase | TokSelect
| TokString String | TokSym Char
deriving Show
alexMonadScanTokens :: Alex [Token]
alexMonadScanTokens = do
inp <- alexGetInput
sc <- alexGetStartCode
case alexScan inp sc of
AlexEOF -> return []
AlexError inp' -> alexError "lexical error"
AlexSkip inp' len -> do
alexSetInput inp'
alexMonadScanTokens
AlexToken inp' len action -> do
alexSetInput inp'
token <- action inp len
tokens <- alexMonadScanTokens
return $ token : tokens
lexTLT :: String -> Either String [Token]
lexTLT s = runAlex s alexMonadScanTokens
}