Changeset 15296 for src/Pugs/Parser

Show
Ignore:
Timestamp:
02/18/07 15:56:10 (21 months ago)
Author:
audreyt
Message:

* Convert VStr from String to ByteString?, and Syn from

String to ID, in Pugs. Benchmark shows the perf gain is 5%,
so it's not worth the trouble of writing a GHC 6.7-compatible
processor. The next commit will revert this commit.

Location:
src/Pugs/Parser
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Parser/Doc.hs

    r14286 r15296  
    9494                let lns' | For { headText = (_:txt) } <- docHead = txt:lns 
    9595                         | otherwise = lns 
    96                     linesVal    = map VStr lns' 
     96                    linesVal    = map _VStr lns' 
    9797                    linesStr    = unlines lns' 
    9898                    linesList   = VList (length linesVal `seq` linesVal) 
    9999                unsafeEvalExp $ Stmts 
    100                     (App (_Var "&push") (Just $ _Var ("@=" ++ section)) [Val (VStr linesStr)]) 
     100                    (App (_Var "&push") (Just $ _Var ("@=" ++ section)) [Val (_VStr linesStr)]) 
    101101                    $ Stmts  
    102102                        (App (_Var "&push") (Just $ _Var ("$=" ++ section)) [Val linesList]) 
    103                         (App (_Var "&push") (Just $ Syn "{}" [_Var "%=POD", Val (VStr section)]) [Val linesList]) 
     103                        (App (_Var "&push") (Just $ _Syn "{}" [_Var "%=POD", Val (_VStr section)]) [Val linesList]) 
    104104            whiteSpace 
    105105            return (rv `seq` emptyExp) 
  • src/Pugs/Parser/Export.hs

    r14240 r15296  
    1717exportSym :: Scope -> String -> Val -> RuleParser () 
    1818exportSym scope ('&':subname) ref = do 
    19     rv <- unsafeEvalExp $ Syn "," [App (_Var "&values") (Just (Val ref)) []] 
     19    rv <- unsafeEvalExp $ _Syn "," [App (_Var "&values") (Just (Val ref)) []] 
    2020    case rv of 
    2121        Val (VList subs) -> do 
     
    2525                        VCode sub | isMulti sub -> ('&':) 
    2626                        _                       -> id 
    27                     mkExp   = Syn ":=" [_Var name, Val val] 
     27                    mkExp   = _Syn ":=" [_Var name, Val val] 
    2828                    mkSym   = _Sym scope (mkMulti name) mkExp 
    2929                doExport scope mkSym 
  • src/Pugs/Parser/Literal.hs

    r15262 r15296  
    1 {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} 
     1{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -foverloaded-strings #-} 
    22module Pugs.Parser.Literal where 
    33 
     
    6060arrayLiteral = try $ do 
    6161    item <- verbatimBrackets ruleBracketedExpression 
    62     return $ Syn "\\[]" [item] 
     62    return $ _Syn "\\[]" [item] 
    6363 
    6464ruleBracketedExpression :: RuleParser Exp 
    6565ruleBracketedExpression = enterBracketLevel ParensBracket $ 
    66     ruleExpression <|> do { whiteSpace; return (Syn "," []) } 
     66    ruleExpression <|> do { whiteSpace; return (_Syn "," []) } 
    6767 
    6868{-| 
     
    7777    key <- identifier `tryFollowedBy` symbol "=>" 
    7878    val <- parseExpWithTightOps 
    79     return (Val (VStr key), val) 
    80     return $ App (_Var "&infix:=>") Nothing [Val (VStr key), val] 
     79    return (Val (_VStr key), val) 
     80    return $ App (_Var "&infix:=>") Nothing [Val (_VStr key), val] 
    8181 
    8282pairAdverb :: RuleParser Exp 
     
    8888        char '!' 
    8989        key <- many1 wordAny 
    90         return $ App (_Var "&infix:=>") Nothing [Val (VStr key), Val (VBool False)] 
     90        return $ App (_Var "&infix:=>") Nothing [Val (_VStr key), Val (VBool False)] 
    9191    shortcutPair = do 
    9292        (s:ss)              <- fmap reverse (many1 ruleSigil) 
    9393        varExp@(Var var)    <- fmap _Var (regularVarNameForSigil s) 
    9494        -- This turns ":$$$x" into "x=>$$$x" 
    95         let appCast sig exp = Syn (shows sig "{}") [exp] 
     95        let appCast sig exp = Syn (cast (shows sig "{}")) [exp] 
    9696        return $ App (_Var "&infix:=>") Nothing 
    97             [ Val (VStr $ cast (v_name var)) 
     97            [ Val (_VStr $ cast (v_name var)) 
    9898            , foldr appCast varExp ss 
    9999            ] 
     
    105105    val <- lexeme ((optional ruleDot >> valueExp lvl) <|> return (Val $ VBool True)) 
    106106    return $ if (all isDigit key) 
    107         then App (_Var "&Pugs::Internals::base") Nothing [Val (VStr key), val] 
    108         else App (_Var "&infix:=>") Nothing [Val (VStr key), val] 
     107        then App (_Var "&Pugs::Internals::base") Nothing [Val (_VStr key), val] 
     108        else App (_Var "&infix:=>") Nothing [Val (_VStr key), val] 
    109109    where 
    110110    valueExp lvl = do 
     
    126126yadaLiteral = expRule $ do 
    127127    sym  <- choice . map symbol $ words " ... ??? !!! " 
    128     return $ App (_Var $ doYada sym) Nothing [Val $ VStr (sym ++ " - not yet implemented")] 
     128    return $ App (_Var $ doYada sym) Nothing [Val $ _VStr (sym ++ " - not yet implemented")] 
    129129    where 
    130130    doYada "..." = "&fail_" -- XXX rename to fail() eventually 
     
    194194    char '\\' 
    195195    nextchar <- escapeCode -- see Lexer.hs 
    196     return (Val $ VStr nextchar) 
     196    return (Val $ _VStr nextchar) 
    197197 
    198198qInterpolateDelimiter :: Char -> RuleParser Exp 
     
    200200    char '\\' 
    201201    c <- oneOf (protectedChar:"\\") 
    202     return (Val $ VStr [c]) 
     202    return (Val $ _VStr [c]) 
    203203 
    204204qInterpolateDelimiterMinimal :: Char -> RuleParser Exp 
     
    206206    char '\\' 
    207207    c <- oneOf (protectedChar:"\\") 
    208     return (Val $ VStr ['\\',c]) 
     208    return (Val $ _VStr ['\\',c]) 
    209209 
    210210qInterpolateDelimiterBalanced :: Char -> RuleParser Exp 
     
    212212    char '\\' 
    213213    c <- oneOf (protectedChar:balancedDelim protectedChar:"\\") 
    214     return (Val $ VStr ['\\',c]) 
     214    return (Val $ _VStr ['\\',c]) 
    215215 
    216216qInterpolateQuoteConstruct :: RuleParser Exp 
     
    296296        markerExp  <- qLiteral1 qStart qEnd qFlags 
    297297        case unwrap markerExp of 
    298             Val (VStr endMarker) -> do 
     298            Val (VStr s) -> do 
    299299                (restOfLine:restOfInput)    <- fmap lines getInput 
    300300                -- When end marker is "END", a line matches it if it looks like "   END". 
    301                 let foundEndMarker line 
     301                let endMarker = cast s 
     302                    foundEndMarker line 
    302303                        = (endMarker `isSuffixOf` line) 
    303304                            && (all isSpace (take (length line - length endMarker) line)) 
     
    347348    string "q_to_eof()" 
    348349    source <- many anyChar 
    349     return $ Val $ VStr $ source 
     350    return $ Val $ _VStr $ source 
    350351 
    351352qLiteral1 :: RuleParser String    -- Opening delimiter 
     
    360361        QS_Yes      -> return (doSplitWords expr) 
    361362        QS_Protect  -> return $ case unwindGroups (unwindConcat (unwrap expr)) of 
    362             []  -> Syn "," [] 
     363            []  -> _Syn "," [] 
    363364            [x] -> x 
    364             xs  -> Syn "," xs 
     365            xs  -> _Syn "," xs 
    365366        QS_No       -> return $ case qfExecute flags of 
    366367            True -> App (_Var "&Pugs::Internals::runShellCommand") Nothing [expr] 
     
    370371    unwindConcat :: Exp -> [Exp] 
    371372    unwindConcat (App _ Nothing [l, r]) = unwindConcat l ++ unwindConcat r 
    372     unwindConcat (Val (VStr str)) 
     373    unwindConcat (Val (VStr buf)) 
    373374        | null str  = [] 
    374375        | otherwise = sepBegin (sepEnd (intersperse Noop splitted)) 
    375376        where 
    376         splitted = map (Val . VStr) (perl6Words str) 
     377        splitted = map (Val . _VStr) (perl6Words str) 
    377378        sepBegin = if isBreakingSpace (head str) then (Noop:) else id 
    378379        sepEnd   = if isBreakingSpace (last str) then (++ [Noop]) else id 
     380        str      = cast buf 
    379381    unwindConcat expr = [expr] 
    380382 
     
    397399    -- a nonbreaking ws char. 
    398400    doSplitWords expr 
    399         | Val (VStr str) <- unwrap expr = doSplitStr perl6Words str 
     401        | Val (VStr str) <- unwrap expr = doSplitStr perl6Words (cast str) 
    400402        | otherwise                     = Ann (Cxt cxtSlurpyAny) (App (_Var "&infix:~~") Nothing [expr, rxSplit]) 
    401403    {- 
     
    410412        ] 
    411413    -} 
    412     rxSplit = Syn "rx" $ 
    413         [ Val $ VStr "([^\\x09\\x0a\\x0d\\x20]+)" 
     414    rxSplit = _Syn "rx" $ 
     415        [ Val $ _VStr "([^\\x09\\x0a\\x0d\\x20]+)" 
    414416        , Val $ VList 
    415             [ castV (VStr "P5", VInt 1) 
    416             , castV (VStr "g", VInt 1) 
    417             , castV (VStr "stringify", VInt 1) 
     417            [ castV (_VStr "P5", VInt 1) 
     418            , castV (_VStr "g", VInt 1) 
     419            , castV (_VStr "stringify", VInt 1) 
    418420            ] 
    419421        ] 
     
    570572        True 
    571573        | (App (Var var) Nothing [Val (VStr name), _]) <- pairs 
    572         , var == cast "&infix:=>" 
    573         , (name ==) `any` words "P5 Perl5 perl5" 
     574        , var == cast (__"&infix:=>") 
     575        , (cast name ==) `any` words "P5 Perl5 perl5" 
    574576        ]) 
    575577    = rxLiteral5 
     
    641643        = exp 
    642644    applyPseudo (Syn syn [Var var, exp]) 
    643         | last syn == '=' 
     645        | last (cast syn) == '=' 
    644646        , var == varTopic 
    645         = App (_Var ("&infix:" ++ init syn)) Nothing [matchResult, exp] 
     647        = App (_Var ("&infix:" ++ init (cast syn))) Nothing [matchResult, exp] 
    646648    applyPseudo x = internalError $ "Unknown pseudo-assignment form:" ++ show x 
    647649    fixPseudo (Ann ann exp) = Ann ann (fixPseudo exp) 
     
    660662    where 
    661663    adv x (Syn "\\{}" [Syn "," pairs]) = Syn "\\{}" 
    662         [Syn "," (App (_Var "&infix:=>") Nothing [Val (VStr x), Val (VBool True)] : pairs)] 
     664        [Syn "," (App (_Var "&infix:=>") Nothing [Val (_VStr x), Val (VBool True)] : pairs)] 
    663665    adv _ _ = internalError "unexpected regex adverb specifier" 
    664666 
  • src/Pugs/Parser/Operator.hs

    r15198 r15296  
    1 {-# OPTIONS_GHC -cpp -fglasgow-exts -funbox-strict-fields -fno-full-laziness -fno-cse -fallow-overlapping-instances -fno-warn-orphans #-} 
     1{-# OPTIONS_GHC -cpp -fglasgow-exts -funbox-strict-fields -fno-full-laziness -fno-cse -fallow-overlapping-instances -fno-warn-orphans -foverloaded-strings #-} 
    22 
    33module Pugs.Parser.Operator where 
     
    6767 
    6868termLevel, methLevel, incrLevel, expoLevel, symbLevel, multLevel, addiLevel, junaLevel, junoLevel :: [RuleOperator Exp] 
    69 termLevel = circumOps (Set.singleton (MkOpName (cast "\\( )"))) 
     69termLevel = circumOps (Set.singleton (MkOpName (_cast "\\( )"))) 
    7070methLevel = methOps (opWords " . .+ .? .* .+ .() .[] .{} .<<>> .= ") 
    7171incrLevel = postOps incrOpsPost ++ preOps incrOpsPre 
    7272expoLevel = rightOps (opWords " ** ") 
    73 symbLevel = preSyn (Set.singleton (MkOpName (cast "|"))) ++ preOps symbPreops 
     73symbLevel = preSyn (Set.singleton (MkOpName (_cast "|"))) ++ preOps symbPreops 
    7474multLevel = leftOps (opWords " * / % x xx +& +< +> ~& ~< ~> ?& ") 
    7575addiLevel = leftOps (opWords " + - ~ +| +^ ~| ~^ ?| ") 
     
    268268 
    269269commaID :: ID 
    270 commaID = cast "," 
     270commaID = _cast "," 
    271271 
    272272data TightFunctions = MkTightFunctions 
     
    306306 
    307307circumOps, rightSyn, chainOps, matchOps, nonSyn, listSyn, preSyn, optPreSyn, preOps, preSymOps, optSymOps, postOps, optOps, leftOps, rightOps, nonOps, listOps :: Set OpName -> [RuleOperator Exp] 
    308 preSyn      = ops  $ makeOp1 Prefix "" Syn 
    309 optPreSyn   = ops  $ makeOp1 OptionalPrefix "" Syn 
     308preSyn      = ops  $ makeOp1 Prefix "" _Syn 
     309optPreSyn   = ops  $ makeOp1 OptionalPrefix "" _Syn 
    310310preOps      = (ops $ makeOp1 Prefix "&prefix:" doApp) . addHyperPrefix 
    311311preSymOps   = (ops $ makeOp1 Prefix "&prefix:" doAppSym) . addHyperPrefix 
     
    319319matchOps    = (ops $ makeOp2Match AssocLeft "&infix:" doApp) . addHyperInfix . addNegation 
    320320chainOps    = (ops $ makeOp2 AssocLeft "&infix:" doApp) . addHyperInfix . addNegation 
    321 rightSyn    = ops $ makeOp2 AssocRight "" Syn 
    322 nonSyn      = ops $ makeOp2 AssocNone "" Syn 
    323 listSyn     = ops $ makeOp0 AssocList "" Syn 
     321rightSyn    = ops $ makeOp2 AssocRight "" _Syn 
     322nonSyn      = ops $ makeOp2 AssocNone "" _Syn 
     323listSyn     = ops $ makeOp0 AssocList "" _Syn 
    324324circumOps   = ops $ makeCircumOp "&circumfix:" 
    325325rightAssignSyn :: RuleOperator Exp 
    326 rightAssignSyn = makeOp2Assign AssocRight "" Syn 
     326rightAssignSyn = makeOp2Assign AssocRight "" _Syn 
    327327rightDotAssignSyn :: RuleOperator Exp 
    328 rightDotAssignSyn = makeOp2DotAssign AssocRight "" Syn 
     328rightDotAssignSyn = makeOp2DotAssign AssocRight "" _Syn 
    329329 
    330330{-# INLINE ops #-} 
     
    396396                state_first_run <- newTVar =<< (fmap scalarRef $! newTVar (VInt 0)) 
    397397                state_fresh     <- newTVar False 
    398                 return $! mkPad [(cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in 
     398                return $! mkPad [(_cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in 
    399399        Syn "block" 
    400400            [ Pad SState pad $! 
     
    488488    hyperFrench = Set.mapMonotonic french xs 
    489489    texan x = cast (__">>" +++ cast x) 
    490     french x = cast (cast "\187" +++ cast x) 
     490    french x = cast (_cast "\187" +++ cast x) 
    491491 
    492492{-| 
     
    522522    y <- parseExpWithTightOps 
    523523    symbol post 
    524     return $ \x z -> Syn syn [x, y, z] 
    525  
    526  
    527  
     524    return $ \x z -> _Syn syn [x, y, z] 
    528525 
    529526emptyTerm :: Exp 
     
    708705    char '|' 
    709706    ruleHyperPost 
    710     return $ cast "&prefix:|<<" 
     707    return $ _cast "&prefix:|<<" 
    711708 
    712709ruleInfixOp :: RuleParser String 
  • src/Pugs/Parser/Program.hs

    r14439 r15296  
    116116runRule env p name str = 
    117117    case ( runParser p (makeState env) name str ) of 
    118         Left err    -> env { envBody = Val $ VError (VStr msg) [mkPos pos pos] } 
     118        Left err    -> env { envBody = Val $ VError (_VStr msg) [mkPos pos pos] } 
    119119            where 
    120120            msg = concat (intersperse "\n" (map filterUnexpected $ lines (showErr err))) 
     
    159159    -- S04: CHECK {...}*      at compile time, ALAP 
    160160    --  $_() for @*CHECK 
    161     rv <- unsafeEvalExp $ Syn "for" 
     161    rv <- unsafeEvalExp $ _Syn "for" 
    162162        [ _Var "@*CHECK" 
    163         , Syn "sub" 
     163        , _Syn "sub" 
    164164            [ Val . VCode $ mkSub 
    165165                { subBody   = App (_Var "$_") Nothing [] 
  • src/Pugs/Parser/Types.hs

    r14624 r15296  
    305305parserWarn str val = do 
    306306    currPos <- getPosition 
    307     traceM (pretty (VError (VStr $ str ++ showVal) [mkPos currPos currPos])) 
     307    traceM (pretty (VError (_VStr $ str ++ showVal) [mkPos currPos currPos])) 
    308308    where 
    309309    showVal = case show val of 
  • src/Pugs/Parser/Unsafe.hs

    r14275 r15296  
    3131    -- pos <- getPosition 
    3232    env <- getRuleEnv 
    33     val <- unsafeEvalExp $ mergeStmts exp (Syn "continuation" []) 
     33    val <- unsafeEvalExp $ mergeStmts exp (_Syn "continuation" []) 
    3434    case val of 
    3535        Val (VControl (ControlContinuation { ccEnv = env' })) -> 
     
    9696        env          <- ask 
    9797        pos          <- getPosition 
    98         case envBody (parseProgram env ("MACRO { " ++ show pos ++" }") code) of 
     98        case envBody (parseProgram env ("MACRO { " ++ show pos ++" }") (cast code)) of 
    9999            Val (err@VError{})  -> fail $ pretty err 
    100100            exp                 -> return exp 
  • src/Pugs/Parser/Util.hs

    r14570 r15296  
    1 {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} 
     1{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -foverloaded-strings #-} 
    22module Pugs.Parser.Util where 
    33 
     
    127127 
    128128_percentUnderscore :: Var 
    129 _percentUnderscore = cast "%_" 
     129_percentUnderscore = _cast "%_" 
    130130 
    131131paramsFor :: SubType -> Maybe [Param] -> [Param] -> [Param] 
     
    157157    , isWritable    = True 
    158158    , isLazy        = False 
    159     , paramName     = cast "&self" 
     159    , paramName     = _cast "&self" 
    160160    , paramContext  = CxtItem typ 
    161161    , paramDefault  = Noop 
     
    177177     
    178178    isHashOrPair (Ann _ exp) = isHashOrPair exp 
    179     isHashOrPair (App (Var var) _ _) = (var == cast "&pair") || (var == cast "&infix:=>")  
     179    isHashOrPair (App (Var var) _ _) = (var == _cast "&pair") || (var == _cast "&infix:=>") 
    180180    isHashOrPair (Syn "%{}" _) = True 
    181181    isHashOrPair (Var var) = v_sigil var == SHash 
     
    208208makeVarWithSigil :: Char -> Exp -> Exp 
    209209makeVarWithSigil '$' x = x 
    210 makeVarWithSigil s   x = Syn (s:"{}") [x] 
     210makeVarWithSigil s   x = Syn (cast (s:"{}")) [x] 
    211211 
    212212-- | splits the string into expressions on whitespace. 
     
    215215doSplitStr f str = case f str of 
    216216    []  -> Syn "," [] 
    217     [x] -> Val (VStr x) 
    218     xs  -> Syn "," $ map (Val . VStr) xs 
     217    [x] -> Val (_VStr x) 
     218    xs  -> Syn "," $ map (Val . _VStr) xs 
    219219 
    220220perl6Words :: String -> [String]