Skip to content
Snippets Groups Projects
Lexer.x 1.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • {
    module ModelParser.Lexer where
    
    import Numeric
    }
     
    %wrapper "basic"
     
    
    $ident = [0-9a-zA-Z!\._\?]
    
    $value = [0-9a-f]
     
    tokens :-
        $white+     ;
        "->"        { \s -> Tarrow }
        "{"         { \s -> Tbopen }
        "}"         { \s -> Tbclose }
        "("         { \s -> Tpopen }
        ")"         { \s -> Tpclose }
        "_"         { \s -> Tunderscore }
        "else"      { \s -> Telse}
        "as-array"  { \s -> Tasarray }
        "BitVec"    { \s -> Tbitvec }
    
        "Array"     { \s -> Tarray }
    
        "as"        { \s -> Tas }
        "const"     { \s -> Tconst }
        "true"      { \s -> Tbool True }
        "false"     { \s -> Tbool False }
        "#x"$value+ { \s -> Tvalue (parseHex s) }
    
        $num+       { \s -> Tvalue (parseDec s) }
    
        $ident+     { \s -> Tident s }    
    {
    
    data Token = Tarrow
               | Tbopen
               | Tbclose
               | Tpopen
               | Tpclose
               | Tunderscore
               | Telse
               | Tasarray
               | Tbitvec
    
               | Tas
               | Tconst
               | Tvalue Int
               | Tbool Bool
               | Tident String
         deriving (Eq, Show)
    
    parseHex :: String -> Int
    parseHex ('#' : 'x' : value) = let [(n, "")] = readHex value in n
    
    
    parseDec :: String -> Int
    parseDec value = let [(n, "")] = readDec value in n
    
    
    model1 = "a.null -> false\nj -> #x00000000\ni -> #x00000000\na.length -> #x00000001"
    
    model1a = model1 ++ "\na -> (_ as-array k!1)"
    model1b = model1 ++ "\na -> ((as const (Array (_ BitVec 32) (_ BitVec 32))) #xffffffff)"
    
    model2 = "a.length -> #x00000001\na.null -> true\ni!0 -> #x00000000\na -> (_ as-array k!1)\nk!1 -> {\n  #x00000000\n}"
    model3 = "a.length -> #x00000003\ni!0 -> #x00000001\na -> (_ as-array k!1)\nk!1 -> {\n  #x00000002 -> #x00000001\n  #x00000001 -> #x00000000\n  else -> #x00000001\n}"
    
    model4 = "a.null -> false\nj -> #x00000010\na -> ((as const (Array (_ BitVec 32) (_ BitVec 32))) #xffffffff)\ni -> #x00000000\na.length -> #x00000001"