Changeset 2940

Show
Ignore:
Timestamp:
05/10/05 20:45:26 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
4498
Message:

* parse for //, rx//, m//, rule{}, and assorted other things.

Location:
src/Pugs
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Eval.hs

    r2895 r2940  
    541541            Just v  -> fromVal v 
    542542            Nothing -> fromAdverb hv ks 
     543    "//" -> reduce (Syn "rx" exps) 
     544    "match" -> reduce (Syn "rx" exps) -- XXX - this is wrong 
    543545    "subst" -> do 
    544546        let [exp, subst, adverbs] = exps 
  • src/Pugs/Parser.hs

    r2931 r2940  
    126126mergeStmts (Sym scope name x) y = Sym scope name (mergeStmts x y) 
    127127mergeStmts (Pad scope lex x) y = Pad scope lex (mergeStmts x y) 
    128 mergeStmts x@(Pos pos (Syn "rx" _)) y = 
     128mergeStmts x@(Pos pos (Syn syn _)) y | (syn ==) `any` words "subst match //" = 
    129129    mergeStmts (Pos pos (App (Var "&infix:~~") [Var "$_", x] [])) y 
    130 mergeStmts x y@(Pos pos (Syn "rx" _)) = 
    131     mergeStmts x (Pos pos (App (Var "&infix:~~") [Var "$_", y] [])) 
    132 mergeStmts x@(Pos pos (Syn "subst" _)) y = 
    133     mergeStmts (Pos pos (App (Var "&infix:~~") [Var "$_", x] [])) y 
    134 mergeStmts x y@(Pos pos (Syn "subst" _)) = 
     130mergeStmts x y@(Pos pos (Syn syn _)) | (syn ==) `any` words "subst match //"  = 
    135131    mergeStmts x (Pos pos (App (Var "&infix:~~") [Var "$_", y] [])) 
    136132mergeStmts x@(Pos pos (Syn "sub" [Val (VCode sub)])) y 
     
    14671463 
    14681464-- Regexps 
     1465rxLiteralAny adverbs 
     1466    | Syn "\\{}" [Syn "," pairs] <- adverbs 
     1467    , not (null [ True | (App (Var "&infix:=>") [Val (VStr "P5"), _] []) <- pairs ]) 
     1468    = rxLiteral5 
     1469    | otherwise 
     1470    = rxLiteral6 
     1471 
    14691472rxLiteral5 :: Char -- ^ Closing delimiter 
    14701473             -> RuleParser Exp 
     
    14891492    let endch = balancedDelim ch 
    14901493    -- XXX - probe for adverbs to determine p5 vs p6 
    1491     expr    <- rxLiteral5 endch 
     1494    expr    <- rxLiteralAny adverbs endch 
    14921495    ch      <- if ch == endch then return ch else do { whiteSpace ; anyChar } 
    14931496    let endch = balancedDelim ch 
     
    14971500rxLiteral :: RuleParser Exp 
    14981501rxLiteral = try $ do 
    1499     symbol "rx" 
     1502    sym     <- symbol "rx" <|> do { symbol "m"; return "match" } <|> do 
     1503        symbol "rule" 
     1504        lookAhead (char '{') 
     1505        return "rx" 
    15001506    adverbs <- ruleAdverbHash 
    15011507    ch      <- anyChar 
    15021508    -- XXX - probe for adverbs to determine p5 vs p6 
    1503     expr    <- rxLiteral5 $ balancedDelim ch 
    1504     return $ Syn "rx" [expr, adverbs] 
     1509    expr    <- rxLiteralAny adverbs $ balancedDelim ch 
     1510    return $ Syn sym [expr, adverbs] 
    15051511 
    15061512rxLiteralBare :: RuleParser Exp 
     
    15081514    ch      <- char '/' 
    15091515    expr    <- rxLiteral6 $ balancedDelim ch 
    1510     return $ Syn "rx" [expr, Val undef] 
     1516    return $ Syn "//" [expr, Val undef] 
    15111517 
    15121518namedLiteral :: String -> Val -> RuleParser Exp