diff --git a/frontends/LexOccam.x b/frontends/LexOccam.x index bd4ef03..f12a2bd 100644 --- a/frontends/LexOccam.x +++ b/frontends/LexOccam.x @@ -199,7 +199,7 @@ mkState code _ s = (Nothing, code) -- | Run the lexer, returning a list of tokens. -- (This is based on the `alexScanTokens` function that Alex provides.) -runLexer :: String -> String -> PassM [Token] +runLexer :: Die m => String -> String -> m [Token] runLexer filename str = go (alexStartPos, '\n', str) 0 where go inp@(pos@(AlexPn _ line col), _, str) code = diff --git a/frontends/OccamPasses.hs b/frontends/OccamPasses.hs index bcd9c85..91f497a 100644 --- a/frontends/OccamPasses.hs +++ b/frontends/OccamPasses.hs @@ -69,12 +69,11 @@ writeIncFile = occamOnlyPass "Write .inc file" [] [] where emitProcsAsExternal :: A.AST -> PassM (Seq.Seq String) emitProcsAsExternal (A.Spec _ (A.Specification _ n (A.Proc _ _ fs _)) scope) - = do thisProc <- sequence ( - [return "#PRAGMA OCCAMEXTERNAL \"PROC " - ,showCode n - ,return "(" + = do origN <- lookupName n >>* A.ndOrigName + thisProc <- sequence ( + [return $ "#PRAGMA TOCKEXTERNAL \"PROC " ++ A.nameName n ++ "(" ] ++ intersperse (return ",") (map showCode fs) ++ - [return ")\"" + [return $ ") = " ++ origN ++ "\"" ]) >>* concat modify $ \cs -> cs { csOriginalTopLevelProcs = A.nameName n : csOriginalTopLevelProcs cs } diff --git a/frontends/ParseOccam.hs b/frontends/ParseOccam.hs index 168454e..27a0f74 100644 --- a/frontends/ParseOccam.hs +++ b/frontends/ParseOccam.hs @@ -19,7 +19,7 @@ with this program. If not, see . -- | Parse occam code into an AST. module ParseOccam (parseOccamProgram) where -import Control.Monad (liftM, when) +import Control.Monad (join, liftM) import Control.Monad.State (MonadState, modify, get, put) import Data.List import qualified Data.Map as Map @@ -1371,24 +1371,18 @@ structuredTypeField pragma :: OccParser () pragma = do Pragma rawP <- genToken isPragma m <- getPosition >>* sourcePosToMeta - pragToks <- case runPragmaLexer "" rawP of - Left _ -> do warnP m WarnUnknownPreprocessorDirective $ - "Unknown PRAGMA: " ++ rawP - return [] - Right toks -> return toks - cs <- getCompState - prod <- return $ - -- Maybe monad: - case findIndex isJust - [ do Token _ (Pragma firstTok) <- listToMaybe pragToks - matchRegex (mkRegex pt) firstTok - | pt <- [ "^SHARED.*" - , "^PERMITALIASES.*" - , "^EXTERNAL.*" - , "^OCCAMEXTERNAL.*" + let prag :: Maybe (Int, String) + prag = join $ find isJust + [ (matchRegex (mkRegex pt) rawP >>= listToMaybe) >>* (,) i + | (i, pt) <- zip [0..] + [ "^SHARED +(.*)" + , "^PERMITALIASES +(.*)" + , "^EXTERNAL +\"(.*)\"" + , "^TOCKEXTERNAL +\"(.*)\"" ] - ] of - Just 0 -> do + ] + mprod <- return $ flip fmap prag $ \(pragType, _) -> case pragType of + 0 -> do vars <- sepBy1 identifier sComma mapM_ (\var -> do st <- get @@ -1398,7 +1392,7 @@ pragma = do Pragma rawP <- genToken isPragma modify $ \st -> st {csNameAttr = Map.insertWith Set.union n (Set.singleton NameShared) (csNameAttr st)}) vars - Just 1 -> do + 1 -> do vars <- sepBy1 identifier sComma mapM_ (\var -> do st <- get @@ -1408,41 +1402,40 @@ pragma = do Pragma rawP <- genToken isPragma modify $ \st -> st {csNameAttr = Map.insertWith Set.union n (Set.singleton NameAliasesPermitted) (csNameAttr st)}) vars - Just pragmaType | pragmaType == 2 || pragmaType == 3 -> do + pragmaType | pragmaType == 2 || pragmaType == 3 -> do m <- md sPROC n <- newProcName fs <- formalList >>* map fst - when (pragmaType == 2) $ do sEq - integer - return () + sEq + origN <- if pragmaType == 2 + then integer >> return (A.nameName n) + else identifier + let on = A.nameName n sp = A.Proc m (A.PlainSpec, A.PlainRec) fs (A.Skip m) - nd = A.NameDef m on on sp A.Original A.NamePredefined A.Unplaced + nd = A.NameDef m on origN sp A.Original A.NamePredefined A.Unplaced ext = if pragmaType == 2 then ExternalOldStyle else ExternalOccam modify $ \st -> st { csNames = Map.insert on nd (csNames st) - , csLocalNames = (on, (n, ProcName)) : csLocalNames st + , csLocalNames = (origN, (n, ProcName)) : csLocalNames st , csExternals = (on, (ext, fs)) : csExternals st } + case (prag, mprod) of + (Just (_, pragStr), Just prod) -> do + toks <- runLexer "" pragStr + cs <- getCompState + case runParser (prod >> getState) cs "" toks of + Left err -> warnP m WarnUnknownPreprocessorDirective $ + "Unknown PRAGMA (parse failed): " ++ show err + Right st -> setState st _ -> warnP m WarnUnknownPreprocessorDirective $ - "Unknown PRAGMA type: " ++ show (listToMaybe pragToks) - let otherToks = safeTail pragToks - case otherToks of - Nothing -> warnP m WarnUnknownPreprocessorDirective $ - "Unknown PRAGMA (no tokens): " ++ rawP - Just toks -> case runParser (prod >> getState) cs "" toks of - Left err -> warnP m WarnUnknownPreprocessorDirective $ - "Unknown PRAGMA (parse failed): " ++ show err - Right st -> setState st + "Unknown PRAGMA type: " ++ show rawP eol where isPragma (Token _ p@(Pragma {})) = Just p isPragma _ = Nothing - safeTail [] = Nothing - safeTail (_:xs) = Just xs - --}}} --{{{ processes process :: OccParser A.Process