File tree Expand file tree Collapse file tree 4 files changed +50
-26
lines changed
Expand file tree Collapse file tree 4 files changed +50
-26
lines changed Original file line number Diff line number Diff 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
232232lexer = (>>=) tokenP
233233-- lexer f = do
234234-- t <- tokenP
235- -- trace ( show t) ( f t)
235+ -- show t `trace` f t
236236
237237}
Original file line number Diff line number Diff line change @@ -250,10 +250,10 @@ alt :: { (Maybe ([Pattern], Ma
250250 | ' otherwise' possibly_empty_block { (Nothing, $2 ) }
251251
252252pattern :: { 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
298298aexpr :: { 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 }
Original file line number Diff line number Diff line change 33
44module ARM.MRAS.ASL.Parser.Tokens
55 ( Token (.. )
6+ , readBin
7+ , readMask
8+ , readReal
69 ) where
710
811import Data.Bool
912import Data.Maybe
13+ import Data.Ratio
1014import Control.DeepSeq
1115import 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
122126readMaskBit ' 1' = Just True
123127readMaskBit ' 0' = Just False
124128readMaskBit ' 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
Original file line number Diff line number Diff line change @@ -36,22 +36,31 @@ parseDefsM asl = StateT $ ExceptT . return . parseDefs asl
3636parseStmtsM :: Monad m => String -> StateT [String ] (ExceptT PError m ) [Statement ]
3737parseStmtsM 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
4148recon :: IO ()
4249recon = 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 ()
You can’t perform that action at this time.
0 commit comments