module Parse.Lex(Lex(..),LexAnnot(..),TokenId) where
import Util.Extra(strStr,strChr)
import TokenId(TokenId)
import Ratio
data LexAnnot = LexArity TokenId Int
| LexPrimitive TokenId (String,String) -- id (opcode,strictness)
instance Show LexAnnot where
showsPrec d (LexArity fun a) = showString "{#- ARITY " . shows fun . showString " = " . shows a . showString "#-}"
showsPrec d (LexPrimitive fun s) = showString "{#- PRIMITIVE ". shows fun . showString " = " . shows s . showString "#-}"
data Lex =
L_EOF
| L_ERROR Char -- illegal character
| L_LPAR
| L_RPAR
| L_LANNOT
| L_RANNOT
| L_LCURL | L_LCURL'
| L_RCURL | L_RCURL'
| L_LBRACK
| L_RBRACK
| L_BACKTICK
| L_COMMA
| L_SEMI | L_SEMI'
-- reserved ops
| L_DotDot
| L_ColonColon
| L_EqualGreater
| L_Equal
| L_At
| L_Lambda
| L_Pipe
| L_Tidle
| L_LessMinus
| L_MinusGreater
| L_Underscore
| L_AVARID TokenId
| L_AVAROP TokenId
| L_ACONID TokenId
| L_ACONOP TokenId
| L_INTEGER Integer
| L_RATIONAL Rational
| L_DOUBLE Double
| L_CHAR Char
| L_STRING [Char]
-- reserved words
| L_case
| L_class
| L_data
| L_default
| L_deriving
| L_do
| L_else
| L_if
| L_import
| L_in
| L_infix
| L_infixl
| L_infixr
| L_instance
| L_let
| L_module
| L_newtype
| L_of
| L_then
| L_type
| L_where
-- | L_as
-- | L_hiding
-- | L_prefix
-- | L_primitive
-- | L_interface
-- | L_qualified
-- | L_renaming
-- | L_unboxed
-- | L_with
instance Eq Lex where
L_EOF == L_EOF = True
(L_ERROR _) == (L_ERROR _) = True
L_LPAR == L_LPAR = True
L_RPAR == L_RPAR = True
L_LANNOT == L_LANNOT = True
L_RANNOT == L_RANNOT = True
L_LCURL == L_LCURL = True
L_LCURL' == L_LCURL' = True
L_RCURL == L_RCURL = True
L_RCURL' == L_RCURL' = True
L_LBRACK == L_LBRACK = True
L_RBRACK == L_RBRACK = True
L_BACKTICK == L_BACKTICK = True
L_COMMA == L_COMMA = True
L_SEMI == L_SEMI = True
L_SEMI' == L_SEMI' = True
L_DotDot == L_DotDot = True
L_ColonColon == L_ColonColon = True
L_EqualGreater == L_EqualGreater = True
L_Equal == L_Equal = True
L_At == L_At = True
L_Lambda == L_Lambda = True
L_Pipe == L_Pipe = True
L_Tidle == L_Tidle = True
L_LessMinus == L_LessMinus = True
L_MinusGreater == L_MinusGreater = True
L_Underscore == L_Underscore = True
(L_AVARID a) == (L_AVARID b) = a==b
(L_AVAROP a) == (L_AVAROP b) = a==b
(L_ACONID a) == (L_ACONID b) = a==b
(L_ACONOP a) == (L_ACONOP b) = a==b
(L_INTEGER _) == (L_INTEGER _) = True
(L_RATIONAL _) == (L_RATIONAL _) = True
(L_DOUBLE _) == (L_DOUBLE _) = True
(L_CHAR _) == (L_CHAR _) = True
(L_STRING _) == (L_STRING _) = True
L_case == L_case = True
L_class == L_class = True
L_data == L_data = True
L_default == L_default = True
L_deriving == L_deriving = True
L_do == L_do = True
L_else == L_else = True
L_if == L_if = True
L_import == L_import = True
L_in == L_in = True
L_infix == L_infix = True
L_infixl == L_infixl = True
L_infixr == L_infixr = True
L_instance == L_instance = True
L_let == L_let = True
L_module == L_module = True
L_newtype == L_newtype = True
L_of == L_of = True
L_then == L_then = True
L_type == L_type = True
L_where == L_where = True
-- L_as == L_as = True
-- L_hiding == L_hiding = True
-- L_interface == L_interface = True
-- L_prefix == L_prefix = True
-- L_primitive == L_primitive = True
-- L_qualified == L_qualified = True
-- L_renaming == L_renaming = True
-- L_unboxed == L_unboxed = True
-- L_with == L_with = True
_ == _ = False
instance Show Lex where
-- Note: EOF really means end-of-file, but because error messages
-- saying "got blah but expected EOF" are less than helpful,
-- I have changed the string for EOF to indicate the likely cause
-- of the parse error.
showsPrec d (L_EOF) = showString "{-end-of-definition-or-EOF-}"
showsPrec d (L_ERROR c) = showString "{-ERROR " . showChar c . showString "-}"
showsPrec d (L_LPAR ) = showString "("
showsPrec d (L_RPAR ) = showString ")"
showsPrec d (L_LANNOT ) = showString "{-#"
showsPrec d (L_RANNOT ) = showString "#-}"
showsPrec d (L_LCURL ) = showString "{"
showsPrec d (L_RCURL ) = showString "}"
showsPrec d (L_LCURL' ) = showString "{-start-of-group-}"
showsPrec d (L_RCURL' ) = showString "{-end-of-group-}"
showsPrec d (L_LBRACK ) = showString "["
showsPrec d (L_RBRACK ) = showString "]"
showsPrec d (L_BACKTICK ) = showString "`"
showsPrec d (L_COMMA ) = showString ","
showsPrec d (L_SEMI ) = showString ";"
showsPrec d (L_SEMI' ) = showString "{-end-of-definition-}"
showsPrec d (L_DotDot) = showString ".."
showsPrec d (L_ColonColon) = showString "::"
showsPrec d (L_EqualGreater) = showString "=>"
showsPrec d (L_Equal) = showString "="
showsPrec d (L_At) = showString "@"
showsPrec d (L_Lambda) = showString "\\"
showsPrec d (L_Pipe) = showString "|"
showsPrec d (L_Tidle) = showString "~"
showsPrec d (L_LessMinus) = showString "<-"
showsPrec d (L_MinusGreater) = showString "->"
showsPrec d (L_Underscore) = showString "_ "
showsPrec d (L_AVARID s) = shows s
showsPrec d (L_AVAROP s) = showChar '(' . shows s . showChar ')'
showsPrec d (L_ACONID s) = showsPrec d s
showsPrec d (L_ACONOP s) = showChar '(' . shows s . showChar ')'
showsPrec d (L_INTEGER i) = shows i
showsPrec d (L_RATIONAL i) = shows i
showsPrec d (L_DOUBLE f) = shows f
showsPrec d (L_CHAR c) = showString (strChr c)
showsPrec d (L_STRING s) = showString (strStr s)
showsPrec d (L_case ) = showString "_case_"
showsPrec d (L_class ) = showString "_class_"
showsPrec d (L_data ) = showString "_data_"
showsPrec d (L_default ) = showString "_default_"
showsPrec d (L_deriving ) = showString "_deriving_"
showsPrec d (L_do ) = showString "_do_"
showsPrec d (L_else ) = showString "_else_"
showsPrec d (L_if ) = showString "_if_"
showsPrec d (L_import ) = showString "_import_"
showsPrec d (L_in ) = showString "_in_"
showsPrec d (L_infix ) = showString "_infix_"
showsPrec d (L_infixl ) = showString "_infixl_"
showsPrec d (L_infixr ) = showString "_infixr_"
showsPrec d (L_instance ) = showString "_instance_"
showsPrec d (L_let ) = showString "_let_"
showsPrec d (L_module ) = showString "_module_"
showsPrec d (L_newtype) = showString "_newtype_"
showsPrec d (L_of ) = showString "_of_"
showsPrec d (L_then ) = showString "_then_"
showsPrec d (L_type ) = showString "_type_"
showsPrec d (L_where ) = showString "_where_"
-- showsPrec d (L_as ) = showString "_as_"
-- showsPrec d (L_hiding ) = showString "_hiding_"
-- showsPrec d (L_interface ) = showString "_interface_"
-- showsPrec d (L_prefix ) = showString "_prefix_"
-- showsPrec d (L_primitive) = showString "_primitive_"
-- showsPrec d (L_qualified) = showString "_qualified_"
-- showsPrec d (L_renaming ) = showString "_renaming_"
-- showsPrec d (L_unboxed) = showString "_unboxed_"
-- showsPrec d (L_with ) = showString "_with_"
|