packages feed

MiniAgda-0.2016.12.19: src/Lexer.x

{

module Lexer where

}

%wrapper "posn"

$digit = 0-9			-- digits
$alpha = [a-zA-Z]		-- alphabetic characters
$u     = [ . \n ]               -- universal: any character
@ident = $alpha ($alpha | $digit | \_ | \')*  -- identifier

tokens :-

$white+				;
"--".*				;
"{-" ([$u # \-] | \- [$u # \}])* ("-")+ "}" ;


sized	    	     	   	{ tok (\p s -> Sized p) }
data				{ tok (\p s -> Data p) }
codata				{ tok (\p s -> CoData p) }
record				{ tok (\p s -> Record p) }
fields                          { tok (\p s -> Fields p) }
fun				{ tok (\p s -> Fun p) }
cofun				{ tok (\p s -> CoFun p) }
pattern                         { tok (\p s -> Pattern p) }
case                            { tok (\p s -> Case p) }
def				{ tok (\p s -> Def p) }
let				{ tok (\p s -> Let p) }
in				{ tok (\p s -> In p) }
eval				{ tok (\p s -> Eval p)}
fail				{ tok (\p s -> Fail p)}
check				{ tok (\p s -> Check p)}
trustme				{ tok (\p s -> TrustMe p)}
impredicative                 	{ tok (\p s -> Impredicative p)}
mutual				{ tok (\p s -> Mutual p) }
Type				{ tok (\p s -> Type p) }
Set				{ tok (\p s -> Set p) }
CoSet				{ tok (\p s -> CoSet p) }
"<|"                            { tok (\p s -> LTri p) }
"|>"                            { tok (\p s -> RTri p) }
Size				{ tok (\p s -> Size p) }
\#				{ tok (\p s -> Infty p) }
\$				{ tok (\p s -> Succ p) }
max                             { tok (\p s -> Max p) }

\{				{ tok (\p s -> BrOpen p) }
\}				{ tok (\p s -> BrClose p) }
\[				{ tok (\p s -> BracketOpen p) }
\]				{ tok (\p s -> BracketClose p) }
\(				{ tok (\p s -> PrOpen p) }
\)				{ tok (\p s -> PrClose p) }
\|				{ tok (\p s -> Bar p) }
\;				{ tok (\p s -> Sem p) }
\:				{ tok (\p s -> Col p) }
\,				{ tok (\p s -> Comma p) }
\.				{ tok (\p s -> Dot p) }
\+\+                            { tok (\p s -> PlusPlus p) }
\+				{ tok (\p s -> Plus p) }
\-				{ tok (\p s -> Minus p) }
\/				{ tok (\p s -> Slash p) }
\*				{ tok (\p s -> Times p) }
\^				{ tok (\p s -> Hat p) }
\&				{ tok (\p s -> Amp p) }
"->"				{ tok (\p s -> Arrow p)  }
"<="                            { tok (\p s -> Leq p)  }
=				{ tok (\p s -> Eq p) }
\\				{ tok (\p s -> Lam p) }
\_				{ tok (\p s -> Underscore p) }
\<                              { tok (\p s -> AngleOpen p) }
\>                              { tok (\p s -> AngleClose p) }

[$digit]+		        { tok (\p s -> (Number s p )) }
@ident                          { tok (\p s -> (Id s p )) }
@ident \. @ident                { tok (\p s -> (qualId s p)) }

{
data Token = Id String AlexPosn
           | QualId (String, String) AlexPosn
     	   | Number String AlexPosn
     	   | Sized AlexPosn
           | Data AlexPosn
	   | CoData AlexPosn
	   | Record AlexPosn
	   | Fields AlexPosn
	   | Mutual AlexPosn
           | Fun AlexPosn
           | CoFun AlexPosn
           | Pattern AlexPosn
	   | Case AlexPosn
	   | Def AlexPosn
	   | Let AlexPosn
	   | In AlexPosn
           | Type AlexPosn
           | Set AlexPosn
           | CoSet AlexPosn
	   | Eval AlexPosn
	   | Fail AlexPosn
	   | Check AlexPosn
	   | TrustMe AlexPosn
	   | Impredicative AlexPosn
           -- size type
           | Size AlexPosn
           | Infty AlexPosn
           | Succ AlexPosn
           | Max AlexPosn
           --
           | LTri AlexPosn
           | RTri AlexPosn
           | AngleOpen AlexPosn
           | AngleClose AlexPosn
           | BrOpen AlexPosn
           | BrClose AlexPosn
           | BracketOpen AlexPosn
           | BracketClose AlexPosn
           | PrOpen AlexPosn
           | PrClose AlexPosn
           | Bar AlexPosn
           | Sem AlexPosn
           | Col AlexPosn
	   | Comma AlexPosn
	   | Dot AlexPosn
           | Arrow AlexPosn
           | Leq AlexPosn
           | Eq AlexPosn
	   | PlusPlus AlexPosn
	   | Plus AlexPosn
	   | Minus AlexPosn
	   | Slash AlexPosn
	   | Times AlexPosn
	   | Hat AlexPosn
	   | Amp AlexPosn
           | Lam AlexPosn
           | Underscore AlexPosn
           | NotUsed AlexPosn -- so happy doesn't generate overlap case pattern warning
             deriving (Eq)

qualId s p = let (m, '.':n) = break (== '.') s in QualId (m,n) p

prettyTok :: Token -> String
prettyTok c = "\"" ++ tk ++ "\" at " ++ (prettyAlexPosn pos) where
  (tk,pos) = case c of
    (Id s p) -> (show s,p)
    (QualId (m, n) p) -> (show m ++ "." ++ show n, p)
    (Number i p) -> (i,p)
    Sized p -> ("sized",p)
    Data p -> ("data",p)
    CoData p -> ("codata",p)
    Record p -> ("record",p)
    Fields p -> ("fields",p)
    Mutual p -> ("mutual",p)
    Fun p -> ("fun",p)
    CoFun p -> ("cofun",p)
    Pattern p -> ("pattern",p)
    Case p -> ("case",p)
    Def p -> ("def",p)
    Let p -> ("let",p)
    In p -> ("in",p)
    Eval p -> ("eval",p)
    Fail p -> ("fail",p)
    Check p -> ("check",p)
    TrustMe p -> ("trustme",p)
    Impredicative p -> ("impredicative",p)
    Type p -> ("Type",p)
    Set p -> ("Set",p)
    CoSet p -> ("CoSet",p)
    Size p -> ("Size",p)
    Infty p -> ("#",p)
    Succ p -> ("$",p)
    Max p -> ("max",p)
    LTri p -> ("<|",p)
    RTri p -> ("|>",p)
    AngleOpen p -> ("<",p)
    AngleClose p -> (">",p)
    BrOpen p -> ("{",p)
    BrClose p -> ("}",p)
    BracketOpen p -> ("[",p)
    BracketClose p -> ("]",p)
    PrOpen p -> ("(",p)
    PrClose p -> (")",p)
    Bar p -> ("|",p)
    Sem p -> (";",p)
    Col p -> (":",p)
    Comma p -> (",",p)
    Dot p -> (".",p)
    Arrow p -> ("->",p)
    Leq p -> ("<=",p)
    Eq p -> ("=",p)
    PlusPlus p -> ("++",p)
    Plus p -> ("+",p)
    Minus p -> ("-",p)
    Slash p -> ("/",p)
    Times p -> ("*",p)
    Hat p -> ("^",p)
    Amp p -> ("&",p)
    Lam p -> ("\\",p)
    Underscore p -> ("_",p)
    _ -> error "not used"


prettyAlexPosn (AlexPn _ line row) = "line " ++ show line ++ ", row " ++ show row

tok f p s = f p s

}