Changeset 2944
- Timestamp:
- 05/10/05 21:29:10 (4 years ago)
- svk:copy_cache_prev:
- 4498
- Location:
- src
- Files:
-
- 5 modified
-
Pugs/AST.hs (modified) (3 diffs)
-
Pugs/Embed/Parrot.hsc (modified) (3 diffs)
-
Pugs/Parser.hs (modified) (3 diffs)
-
Pugs/Prim/Match.hs (modified) (2 diffs)
-
pge/PGE-Hs.pbc (modified) (previous)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r2936 r2944 765 765 cxtOfSigil '%' = cxtSlurpyAny 766 766 cxtOfSigil '&' = CxtItem $ mkType "Code" 767 cxtOfSigil '<' = CxtItem $ mkType "Rule" 767 768 cxtOfSigil x = internalError $ "cxtOfSigil: unexpected character: " ++ show x 768 769 … … 774 775 typeOfSigil '%' = mkType "Hash" 775 776 typeOfSigil '&' = mkType "Code" 777 typeOfSigil '<' = mkType "Rule" 776 778 typeOfSigil x = internalError $ "typeOfSigil: unexpected character: " ++ show x 777 779 … … 1237 1239 newObject (MkType "Code") = liftSTM $ 1238 1240 fmap codeRef $ newTVar mkSub 1241 newObject (MkType "Rule") = liftSTM $ 1242 fmap scalarRef $ newTVar undef 1239 1243 newObject typ = fail ("Cannot create object: " ++ showType typ) 1240 1244 -
src/Pugs/Embed/Parrot.hsc
r2930 r2944 34 34 removeFile file 35 35 36 evalPGE :: FilePath -> String -> String -> IO String37 evalPGE path str pattern = do36 evalPGE :: FilePath -> String -> String -> [(String, String)] -> IO String 37 evalPGE path str pattern subrules = do 38 38 cmd <- findParrot 39 39 (_, out, err, pid) <- runInteractiveProcess cmd 40 ["run_pge.pbc", str, pattern] (Just path) Nothing 40 ["run_pge.pbc", str, pattern] ++ concatMap (\(n, r) -> [n, r]) subrules 41 (Just path) Nothing 41 42 rv <- waitForProcess pid 42 43 errMsg <- hGetContents err … … 106 107 return interp 107 108 108 loadPGE :: ParrotInterp -> FilePath -> IO ParrotPMC109 loadPGE :: ParrotInterp -> FilePath -> IO (ParrotPMC, ParrotPMC) 109 110 loadPGE interp path = do 110 111 ns <- withCString "PGE::Hs" $ const_string interp 111 112 sym <- withCString "match" $ const_string interp 112 sub <- parrot_find_global interp ns sym 113 if sub /= nullPtr then return sub else do 113 match <- parrot_find_global interp ns sym 114 sym <- withCString "add_rule" $ const_string interp 115 add <- parrot_find_global interp ns sym 116 if match /= nullPtr then return (match, add) else do 114 117 pf <- withCString (path ++ "/PGE-Hs.pbc") $ parrot_readbc interp 115 118 parrot_loadbc interp pf … … 117 120 loadPGE interp path 118 121 119 evalPGE :: FilePath -> String -> String -> IO String 120 evalPGE path str pattern = do 121 interp <- initParrot 122 sub <- loadPGE interp path 123 s1 <- withCString str $ const_string interp 124 s2 <- withCString pattern $ const_string interp 125 s5 <- withCString "SSS" $ \sig -> do 126 parrot_call_sub_SSS interp sub sig s1 s2 122 evalPGE :: FilePath -> String -> String -> [(String, String)] -> IO String 123 evalPGE path str pattern subrules = do 124 interp <- initParrot 125 (match, add) <- loadPGE interp path 126 (`mapM_` subrules) $ \(name, rule) -> do 127 s1 <- withCString name $ const_string interp 128 s2 <- withCString rule $ const_string interp 129 withCString "SSS" $ \sig -> do 130 parrot_call_sub_SSS interp add sig s1 s2 131 s1 <- withCString str $ const_string interp 132 s2 <- withCString pattern $ const_string interp 133 s5 <- withCString "SSS" $ \sig -> do 134 parrot_call_sub_SSS interp match sig s1 s2 127 135 peekCString =<< #{peek STRING, strstart} s5 128 136 -
src/Pugs/Parser.hs
r2940 r2944 200 200 [ ruleSubDeclaration 201 201 , ruleClosureTrait False 202 , ruleRuleDeclaration 202 203 ] 203 204 … … 249 250 ++ (maybe (if null names' then [defaultArrayParam] else []) id formal) 250 251 252 ruleRuleDeclaration :: RuleParser Exp 253 ruleRuleDeclaration = rule "rule declaration" $ try $ do 254 symbol "rule" 255 name <- identifier 256 adverbs <- ruleAdverbHash 257 ch <- char '{' 258 expr <- rxLiteralAny adverbs $ balancedDelim ch 259 let exp = Syn ":=" [Var ('<':name), Syn "rx" [expr, adverbs]] -- , bodyPos) 260 unsafeEvalExp (Sym SGlobal ('<':name) exp) 261 return emptyExp 251 262 252 263 ruleSubDeclaration :: RuleParser Exp … … 1502 1513 sym <- symbol "rx" <|> do { symbol "m"; return "match" } <|> do 1503 1514 symbol "rule" 1504 lookAhead (char '{')1515 lookAhead $ do { ruleAdverbHash; char '{' } 1505 1516 return "rx" 1506 1517 adverbs <- ruleAdverbHash 1507 1518 ch <- anyChar 1508 -- XXX - probe for adverbs to determine p5 vs p61509 1519 expr <- rxLiteralAny adverbs $ balancedDelim ch 1510 1520 return $ Syn sym [expr, adverbs] -
src/Pugs/Prim/Match.hs
r2942 r2944 20 20 hasSrc <- liftIO $ doesDirectoryExist pwd2 21 21 let pwd = if hasSrc then pwd2 else pwd1 22 pge <- liftIO $ evalPGE pwd (encodeUTF8 cs) (encodeUTF8 re) 22 glob <- askGlobal 23 let syms = [ (name, tvar) | (('<':name), [(_, tvar)]) <- padToList glob ] 24 subrules <- forM syms $ \(name, tvar) -> do 25 ref <- liftSTM $ readTVar tvar 26 (VRule rule) <- fromVal =<< readRef ref 27 return (name, rxRule rule) 28 pge <- liftIO $ evalPGE pwd (encodeUTF8 cs) (encodeUTF8 re) subrules 23 29 rv <- tryIO Nothing $ fmap Just (readIO $ decodeUTF8 pge) 24 30 let matchToVal PGE_Fail = VMatch mkMatchFail … … 32 38 case rv of 33 39 Just m -> fromVal (matchToVal m) 34 Nothing -> fail ("Cannot parse PGE: " ++ pge) 40 Nothing -> do 41 liftIO $ putStrLn ("*** Cannot parse PGE: " ++ re ++ "\n*** Error: " ++ pge) 42 return mkMatchFail 35 43 36 44 doMatch cs MkRulePCRE{ rxRegex = re } = do
