Skip to content

Commit a98ca97

Browse files
committed
Structure literal tokens
1 parent e1e435f commit a98ca97

File tree

4 files changed

+50
-26
lines changed

4 files changed

+50
-26
lines changed

asl/src/ARM/MRAS/ASL/Parser/Lexer.x

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,12 @@ asl :-
125125
"(" { tok TokLParen }
126126
")" { tok TokRParen }
127127

128-
@bin { str TokBin }
129-
@mask { str TokMask }
130-
@int { str TokInt }
131-
@hex { str TokHex }
132-
@real { str TokReal }
133-
@string { str TokString }
128+
@bin { str (TokBin . readBin) }
129+
@mask { str (TokMask . readMask) }
130+
@int { str (TokInt . read) }
131+
@hex { str (TokHex . read) }
132+
@real { str (TokReal . readReal) }
133+
@string { str TokString }
134134

135135
@ident { ident }
136136

@@ -232,6 +232,6 @@ lexer :: (Token -> P a) -> P a
232232
lexer = (>>=) tokenP
233233
-- lexer f = do
234234
-- t <- tokenP
235-
-- trace (show t) (f t)
235+
-- show t `trace` f t
236236
237237
}

asl/src/ARM/MRAS/ASL/Parser/Parser.y

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,10 @@ alt :: { (Maybe ([Pattern], Ma
250250
| 'otherwise' possibly_empty_block { (Nothing, $2) }
251251

252252
pattern :: { Pattern }
253-
: INT { PatInt 0 }
254-
| HEX { PatHex 0 }
255-
| BIN { PatBin [] }
256-
| MASK { PatMask [] }
253+
: INT { PatInt $1 }
254+
| HEX { PatHex $1 }
255+
| BIN { PatBin $1 }
256+
| MASK { PatMask $1 }
257257
| IDENT { PatIdent (Ident $1) }
258258
| '(' pattern csl_pattern ')' { PatTuple ($2 :| $3) }
259259
;
@@ -296,11 +296,11 @@ nonempty_block :: { NonEmpty Statement }
296296
-- Expressions
297297

298298
aexpr :: { Expr }
299-
: INT { ExprInt 0 }
300-
| HEX { ExprHex 0 }
301-
| REAL { ExprReal 0 }
302-
| BIN { ExprBin [] }
303-
| MASK { ExprMask [] }
299+
: INT { ExprInt $1 }
300+
| HEX { ExprHex $1 }
301+
| REAL { ExprReal $1 }
302+
| BIN { ExprBin $1 }
303+
| MASK { ExprMask $1 }
304304
| STRING { ExprStr $1 }
305305
| qualident { ExprId $1 }
306306
| qualident '(' csl_expr ')' { ExprApp $1 $3 }

asl/src/ARM/MRAS/ASL/Parser/Tokens.hs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33

44
module ARM.MRAS.ASL.Parser.Tokens
55
( Token(..)
6+
, readBin
7+
, readMask
8+
, readReal
69
) where
710

811
import Data.Bool
912
import Data.Maybe
13+
import Data.Ratio
1014
import Control.DeepSeq
1115
import GHC.Generics (Generic)
1216

@@ -17,11 +21,11 @@ data Token =
1721
| TokIndent
1822
| TokDedent
1923

20-
| TokInt String
21-
| TokHex String
22-
| TokReal String
23-
| TokBin String
24-
| TokMask String
24+
| TokInt Integer
25+
| TokHex Integer
26+
| TokReal Rational
27+
| TokBin [Bool]
28+
| TokMask [Maybe Bool]
2529
| TokString String
2630
| TokIdent String
2731
| TokTident String
@@ -122,3 +126,14 @@ readMaskBit :: Char -> Maybe Bool
122126
readMaskBit '1' = Just True
123127
readMaskBit '0' = Just False
124128
readMaskBit 'x' = Nothing
129+
130+
readBin :: String -> [Bool]
131+
readBin = map readBit . filter (/= ' ') . init . tail
132+
133+
readMask :: String -> [Maybe Bool]
134+
readMask = map readMaskBit . filter (/= ' ') . init . tail
135+
136+
readReal :: String -> Rational
137+
readReal x = read before % 1 + read after % 10^(length after)
138+
where
139+
(before, '.':after) = span (/= '.') x

asl/test/Recon.hs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,31 @@ parseDefsM asl = StateT $ ExceptT . return . parseDefs asl
3636
parseStmtsM :: Monad m => String -> StateT [String] (ExceptT PError m) [Statement]
3737
parseStmtsM asl = StateT $ \s -> ExceptT (return (fmap (, s) (parseStmts s asl)))
3838

39-
needle = "LExprDots"
39+
infIx :: Eq a => [a] -> [a] -> Maybe Int
40+
infIx needle = fmap fst . find (isPrefixOf needle . snd) . zip [0..] . tails
41+
42+
around :: Eq a => Int -> [a] -> [a] -> Maybe [a]
43+
around n needle haystack = flip fmap (infIx needle haystack) $ \i -> take n (drop i haystack)
44+
45+
n = 60
46+
needle = "TyExprApp"
4047

4148
recon :: IO ()
4249
recon = do
4350
r <- runExceptT . flip runStateT [] $ do
4451
liftIO (readFile "test/prelude.asl") >>= parseDefsM
4552
forM_ (topoSort sharedps) $ \ps -> do
4653
ast <- parseDefsM (_shared_ps_code ps)
47-
when (needle `isInfixOf` (show ast)) $ do
48-
liftIO . putStrLn $ "sharedps: " ++ _shared_ps_name ps
54+
case around n needle (show ast) of
55+
Nothing -> return ()
56+
Just arnd -> liftIO $ putStrLn $ "sharedps: " ++ _shared_ps_name ps ++ ": " ++ arnd
4957
forM_ (base ++ fpsimd) $ \insn -> do
5058
let pss = insn ^.. (insn_classes.traverse._2 <> insn_ps).traverse
5159
forM_ pss $ \ps -> do
5260
ast <- parseStmtsM (_ps_code ps)
53-
when (needle `isInfixOf` (show ast)) $ do
54-
liftIO . putStrLn $ "insn: " ++ _insn_file insn
61+
case around n needle (show ast) of
62+
Nothing -> return ()
63+
Just arnd -> liftIO $ putStrLn $ "insn: " ++ _insn_file insn ++ ": " ++ arnd
5564
case r of
5665
Left err -> die (show err)
5766
Right _ -> return ()

0 commit comments

Comments
 (0)