Changeset 2944

Show
Ignore:
Timestamp:
05/10/05 21:29:10 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
4498
Message:

* named rules and subrule support.

Location:
src
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST.hs

    r2936 r2944  
    765765cxtOfSigil '%'  = cxtSlurpyAny 
    766766cxtOfSigil '&'  = CxtItem $ mkType "Code" 
     767cxtOfSigil '<'  = CxtItem $ mkType "Rule" 
    767768cxtOfSigil x    = internalError $ "cxtOfSigil: unexpected character: " ++ show x 
    768769 
     
    774775typeOfSigil '%'  = mkType "Hash" 
    775776typeOfSigil '&'  = mkType "Code" 
     777typeOfSigil '<'  = mkType "Rule" 
    776778typeOfSigil x    = internalError $ "typeOfSigil: unexpected character: " ++ show x 
    777779 
     
    12371239newObject (MkType "Code")   = liftSTM $ 
    12381240    fmap codeRef $ newTVar mkSub 
     1241newObject (MkType "Rule") = liftSTM $ 
     1242    fmap scalarRef $ newTVar undef 
    12391243newObject typ = fail ("Cannot create object: " ++ showType typ) 
    12401244 
  • src/Pugs/Embed/Parrot.hsc

    r2930 r2944  
    3434    removeFile file 
    3535 
    36 evalPGE :: FilePath -> String -> String -> IO String 
    37 evalPGE path str pattern = do 
     36evalPGE :: FilePath -> String -> String -> [(String, String)] -> IO String 
     37evalPGE path str pattern subrules = do 
    3838    cmd <- findParrot 
    3939    (_, 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  
    4142    rv      <- waitForProcess pid 
    4243    errMsg  <- hGetContents err 
     
    106107    return interp 
    107108 
    108 loadPGE :: ParrotInterp -> FilePath -> IO ParrotPMC 
     109loadPGE :: ParrotInterp -> FilePath -> IO (ParrotPMC, ParrotPMC) 
    109110loadPGE interp path = do 
    110111    ns      <- withCString "PGE::Hs" $ const_string interp 
    111112    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 
    114117    pf      <- withCString (path ++ "/PGE-Hs.pbc") $ parrot_readbc interp 
    115118    parrot_loadbc interp pf 
     
    117120    loadPGE interp path 
    118121 
    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 
     122evalPGE :: FilePath -> String -> String -> [(String, String)] -> IO String 
     123evalPGE 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 
    127135    peekCString =<< #{peek STRING, strstart} s5 
    128136 
  • src/Pugs/Parser.hs

    r2940 r2944  
    200200    [ ruleSubDeclaration 
    201201    , ruleClosureTrait False 
     202    , ruleRuleDeclaration 
    202203    ] 
    203204 
     
    249250        ++ (maybe (if null names' then [defaultArrayParam] else []) id formal) 
    250251 
     252ruleRuleDeclaration :: RuleParser Exp 
     253ruleRuleDeclaration = 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 
    251262 
    252263ruleSubDeclaration :: RuleParser Exp 
     
    15021513    sym     <- symbol "rx" <|> do { symbol "m"; return "match" } <|> do 
    15031514        symbol "rule" 
    1504         lookAhead (char '{') 
     1515        lookAhead $ do { ruleAdverbHash; char '{' } 
    15051516        return "rx" 
    15061517    adverbs <- ruleAdverbHash 
    15071518    ch      <- anyChar 
    1508     -- XXX - probe for adverbs to determine p5 vs p6 
    15091519    expr    <- rxLiteralAny adverbs $ balancedDelim ch 
    15101520    return $ Syn sym [expr, adverbs] 
  • src/Pugs/Prim/Match.hs

    r2942 r2944  
    2020    hasSrc <- liftIO $ doesDirectoryExist pwd2 
    2121    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 
    2329    rv  <- tryIO Nothing $ fmap Just (readIO $ decodeUTF8 pge)  
    2430    let matchToVal PGE_Fail = VMatch mkMatchFail 
     
    3238    case rv of 
    3339        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 
    3543 
    3644doMatch cs MkRulePCRE{ rxRegex = re } = do