Changeset 15296 for src/Pugs/Parser
- Timestamp:
- 02/18/07 15:56:10 (21 months ago)
- Location:
- src/Pugs/Parser
- Files:
-
- 8 modified
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Parser/Doc.hs
r14286 r15296 94 94 let lns' | For { headText = (_:txt) } <- docHead = txt:lns 95 95 | otherwise = lns 96 linesVal = map VStr lns'96 linesVal = map _VStr lns' 97 97 linesStr = unlines lns' 98 98 linesList = VList (length linesVal `seq` linesVal) 99 99 unsafeEvalExp $ Stmts 100 (App (_Var "&push") (Just $ _Var ("@=" ++ section)) [Val ( VStr linesStr)])100 (App (_Var "&push") (Just $ _Var ("@=" ++ section)) [Val (_VStr linesStr)]) 101 101 $ Stmts 102 102 (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]) 104 104 whiteSpace 105 105 return (rv `seq` emptyExp) -
src/Pugs/Parser/Export.hs
r14240 r15296 17 17 exportSym :: Scope -> String -> Val -> RuleParser () 18 18 exportSym scope ('&':subname) ref = do 19 rv <- unsafeEvalExp $ Syn "," [App (_Var "&values") (Just (Val ref)) []]19 rv <- unsafeEvalExp $ _Syn "," [App (_Var "&values") (Just (Val ref)) []] 20 20 case rv of 21 21 Val (VList subs) -> do … … 25 25 VCode sub | isMulti sub -> ('&':) 26 26 _ -> id 27 mkExp = Syn ":=" [_Var name, Val val]27 mkExp = _Syn ":=" [_Var name, Val val] 28 28 mkSym = _Sym scope (mkMulti name) mkExp 29 29 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 #-} 2 2 module Pugs.Parser.Literal where 3 3 … … 60 60 arrayLiteral = try $ do 61 61 item <- verbatimBrackets ruleBracketedExpression 62 return $ Syn "\\[]" [item]62 return $ _Syn "\\[]" [item] 63 63 64 64 ruleBracketedExpression :: RuleParser Exp 65 65 ruleBracketedExpression = enterBracketLevel ParensBracket $ 66 ruleExpression <|> do { whiteSpace; return ( Syn "," []) }66 ruleExpression <|> do { whiteSpace; return (_Syn "," []) } 67 67 68 68 {-| … … 77 77 key <- identifier `tryFollowedBy` symbol "=>" 78 78 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] 81 81 82 82 pairAdverb :: RuleParser Exp … … 88 88 char '!' 89 89 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)] 91 91 shortcutPair = do 92 92 (s:ss) <- fmap reverse (many1 ruleSigil) 93 93 varExp@(Var var) <- fmap _Var (regularVarNameForSigil s) 94 94 -- 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] 96 96 return $ App (_Var "&infix:=>") Nothing 97 [ Val ( VStr $ cast (v_name var))97 [ Val (_VStr $ cast (v_name var)) 98 98 , foldr appCast varExp ss 99 99 ] … … 105 105 val <- lexeme ((optional ruleDot >> valueExp lvl) <|> return (Val $ VBool True)) 106 106 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] 109 109 where 110 110 valueExp lvl = do … … 126 126 yadaLiteral = expRule $ do 127 127 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")] 129 129 where 130 130 doYada "..." = "&fail_" -- XXX rename to fail() eventually … … 194 194 char '\\' 195 195 nextchar <- escapeCode -- see Lexer.hs 196 return (Val $ VStr nextchar)196 return (Val $ _VStr nextchar) 197 197 198 198 qInterpolateDelimiter :: Char -> RuleParser Exp … … 200 200 char '\\' 201 201 c <- oneOf (protectedChar:"\\") 202 return (Val $ VStr [c])202 return (Val $ _VStr [c]) 203 203 204 204 qInterpolateDelimiterMinimal :: Char -> RuleParser Exp … … 206 206 char '\\' 207 207 c <- oneOf (protectedChar:"\\") 208 return (Val $ VStr ['\\',c])208 return (Val $ _VStr ['\\',c]) 209 209 210 210 qInterpolateDelimiterBalanced :: Char -> RuleParser Exp … … 212 212 char '\\' 213 213 c <- oneOf (protectedChar:balancedDelim protectedChar:"\\") 214 return (Val $ VStr ['\\',c])214 return (Val $ _VStr ['\\',c]) 215 215 216 216 qInterpolateQuoteConstruct :: RuleParser Exp … … 296 296 markerExp <- qLiteral1 qStart qEnd qFlags 297 297 case unwrap markerExp of 298 Val (VStr endMarker) -> do298 Val (VStr s) -> do 299 299 (restOfLine:restOfInput) <- fmap lines getInput 300 300 -- 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 302 303 = (endMarker `isSuffixOf` line) 303 304 && (all isSpace (take (length line - length endMarker) line)) … … 347 348 string "q_to_eof()" 348 349 source <- many anyChar 349 return $ Val $ VStr $ source350 return $ Val $ _VStr $ source 350 351 351 352 qLiteral1 :: RuleParser String -- Opening delimiter … … 360 361 QS_Yes -> return (doSplitWords expr) 361 362 QS_Protect -> return $ case unwindGroups (unwindConcat (unwrap expr)) of 362 [] -> Syn "," []363 [] -> _Syn "," [] 363 364 [x] -> x 364 xs -> Syn "," xs365 xs -> _Syn "," xs 365 366 QS_No -> return $ case qfExecute flags of 366 367 True -> App (_Var "&Pugs::Internals::runShellCommand") Nothing [expr] … … 370 371 unwindConcat :: Exp -> [Exp] 371 372 unwindConcat (App _ Nothing [l, r]) = unwindConcat l ++ unwindConcat r 372 unwindConcat (Val (VStr str))373 unwindConcat (Val (VStr buf)) 373 374 | null str = [] 374 375 | otherwise = sepBegin (sepEnd (intersperse Noop splitted)) 375 376 where 376 splitted = map (Val . VStr) (perl6Words str)377 splitted = map (Val . _VStr) (perl6Words str) 377 378 sepBegin = if isBreakingSpace (head str) then (Noop:) else id 378 379 sepEnd = if isBreakingSpace (last str) then (++ [Noop]) else id 380 str = cast buf 379 381 unwindConcat expr = [expr] 380 382 … … 397 399 -- a nonbreaking ws char. 398 400 doSplitWords expr 399 | Val (VStr str) <- unwrap expr = doSplitStr perl6Words str401 | Val (VStr str) <- unwrap expr = doSplitStr perl6Words (cast str) 400 402 | otherwise = Ann (Cxt cxtSlurpyAny) (App (_Var "&infix:~~") Nothing [expr, rxSplit]) 401 403 {- … … 410 412 ] 411 413 -} 412 rxSplit = Syn "rx" $413 [ Val $ VStr "([^\\x09\\x0a\\x0d\\x20]+)"414 rxSplit = _Syn "rx" $ 415 [ Val $ _VStr "([^\\x09\\x0a\\x0d\\x20]+)" 414 416 , 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) 418 420 ] 419 421 ] … … 570 572 True 571 573 | (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" 574 576 ]) 575 577 = rxLiteral5 … … 641 643 = exp 642 644 applyPseudo (Syn syn [Var var, exp]) 643 | last syn== '='645 | last (cast syn) == '=' 644 646 , var == varTopic 645 = App (_Var ("&infix:" ++ init syn)) Nothing [matchResult, exp]647 = App (_Var ("&infix:" ++ init (cast syn))) Nothing [matchResult, exp] 646 648 applyPseudo x = internalError $ "Unknown pseudo-assignment form:" ++ show x 647 649 fixPseudo (Ann ann exp) = Ann ann (fixPseudo exp) … … 660 662 where 661 663 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)] 663 665 adv _ _ = internalError "unexpected regex adverb specifier" 664 666 -
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 #-} 2 2 3 3 module Pugs.Parser.Operator where … … 67 67 68 68 termLevel, methLevel, incrLevel, expoLevel, symbLevel, multLevel, addiLevel, junaLevel, junoLevel :: [RuleOperator Exp] 69 termLevel = circumOps (Set.singleton (MkOpName ( cast "\\( )")))69 termLevel = circumOps (Set.singleton (MkOpName (_cast "\\( )"))) 70 70 methLevel = methOps (opWords " . .+ .? .* .+ .() .[] .{} .<<>> .= ") 71 71 incrLevel = postOps incrOpsPost ++ preOps incrOpsPre 72 72 expoLevel = rightOps (opWords " ** ") 73 symbLevel = preSyn (Set.singleton (MkOpName ( cast "|"))) ++ preOps symbPreops73 symbLevel = preSyn (Set.singleton (MkOpName (_cast "|"))) ++ preOps symbPreops 74 74 multLevel = leftOps (opWords " * / % x xx +& +< +> ~& ~< ~> ?& ") 75 75 addiLevel = leftOps (opWords " + - ~ +| +^ ~| ~^ ?| ") … … 268 268 269 269 commaID :: ID 270 commaID = cast ","270 commaID = _cast "," 271 271 272 272 data TightFunctions = MkTightFunctions … … 306 306 307 307 circumOps, 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 "" Syn309 optPreSyn = ops $ makeOp1 OptionalPrefix "" Syn308 preSyn = ops $ makeOp1 Prefix "" _Syn 309 optPreSyn = ops $ makeOp1 OptionalPrefix "" _Syn 310 310 preOps = (ops $ makeOp1 Prefix "&prefix:" doApp) . addHyperPrefix 311 311 preSymOps = (ops $ makeOp1 Prefix "&prefix:" doAppSym) . addHyperPrefix … … 319 319 matchOps = (ops $ makeOp2Match AssocLeft "&infix:" doApp) . addHyperInfix . addNegation 320 320 chainOps = (ops $ makeOp2 AssocLeft "&infix:" doApp) . addHyperInfix . addNegation 321 rightSyn = ops $ makeOp2 AssocRight "" Syn322 nonSyn = ops $ makeOp2 AssocNone "" Syn323 listSyn = ops $ makeOp0 AssocList "" Syn321 rightSyn = ops $ makeOp2 AssocRight "" _Syn 322 nonSyn = ops $ makeOp2 AssocNone "" _Syn 323 listSyn = ops $ makeOp0 AssocList "" _Syn 324 324 circumOps = ops $ makeCircumOp "&circumfix:" 325 325 rightAssignSyn :: RuleOperator Exp 326 rightAssignSyn = makeOp2Assign AssocRight "" Syn326 rightAssignSyn = makeOp2Assign AssocRight "" _Syn 327 327 rightDotAssignSyn :: RuleOperator Exp 328 rightDotAssignSyn = makeOp2DotAssign AssocRight "" Syn328 rightDotAssignSyn = makeOp2DotAssign AssocRight "" _Syn 329 329 330 330 {-# INLINE ops #-} … … 396 396 state_first_run <- newTVar =<< (fmap scalarRef $! newTVar (VInt 0)) 397 397 state_fresh <- newTVar False 398 return $! mkPad [( cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in398 return $! mkPad [(_cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in 399 399 Syn "block" 400 400 [ Pad SState pad $! … … 488 488 hyperFrench = Set.mapMonotonic french xs 489 489 texan x = cast (__">>" +++ cast x) 490 french x = cast ( cast "\187" +++ cast x)490 french x = cast (_cast "\187" +++ cast x) 491 491 492 492 {-| … … 522 522 y <- parseExpWithTightOps 523 523 symbol post 524 return $ \x z -> Syn syn [x, y, z] 525 526 527 524 return $ \x z -> _Syn syn [x, y, z] 528 525 529 526 emptyTerm :: Exp … … 708 705 char '|' 709 706 ruleHyperPost 710 return $ cast "&prefix:|<<"707 return $ _cast "&prefix:|<<" 711 708 712 709 ruleInfixOp :: RuleParser String -
src/Pugs/Parser/Program.hs
r14439 r15296 116 116 runRule env p name str = 117 117 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] } 119 119 where 120 120 msg = concat (intersperse "\n" (map filterUnexpected $ lines (showErr err))) … … 159 159 -- S04: CHECK {...}* at compile time, ALAP 160 160 -- $_() for @*CHECK 161 rv <- unsafeEvalExp $ Syn "for"161 rv <- unsafeEvalExp $ _Syn "for" 162 162 [ _Var "@*CHECK" 163 , Syn "sub"163 , _Syn "sub" 164 164 [ Val . VCode $ mkSub 165 165 { subBody = App (_Var "$_") Nothing [] -
src/Pugs/Parser/Types.hs
r14624 r15296 305 305 parserWarn str val = do 306 306 currPos <- getPosition 307 traceM (pretty (VError ( VStr $ str ++ showVal) [mkPos currPos currPos]))307 traceM (pretty (VError (_VStr $ str ++ showVal) [mkPos currPos currPos])) 308 308 where 309 309 showVal = case show val of -
src/Pugs/Parser/Unsafe.hs
r14275 r15296 31 31 -- pos <- getPosition 32 32 env <- getRuleEnv 33 val <- unsafeEvalExp $ mergeStmts exp ( Syn "continuation" [])33 val <- unsafeEvalExp $ mergeStmts exp (_Syn "continuation" []) 34 34 case val of 35 35 Val (VControl (ControlContinuation { ccEnv = env' })) -> … … 96 96 env <- ask 97 97 pos <- getPosition 98 case envBody (parseProgram env ("MACRO { " ++ show pos ++" }") code) of98 case envBody (parseProgram env ("MACRO { " ++ show pos ++" }") (cast code)) of 99 99 Val (err@VError{}) -> fail $ pretty err 100 100 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 #-} 2 2 module Pugs.Parser.Util where 3 3 … … 127 127 128 128 _percentUnderscore :: Var 129 _percentUnderscore = cast "%_"129 _percentUnderscore = _cast "%_" 130 130 131 131 paramsFor :: SubType -> Maybe [Param] -> [Param] -> [Param] … … 157 157 , isWritable = True 158 158 , isLazy = False 159 , paramName = cast "&self"159 , paramName = _cast "&self" 160 160 , paramContext = CxtItem typ 161 161 , paramDefault = Noop … … 177 177 178 178 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:=>") 180 180 isHashOrPair (Syn "%{}" _) = True 181 181 isHashOrPair (Var var) = v_sigil var == SHash … … 208 208 makeVarWithSigil :: Char -> Exp -> Exp 209 209 makeVarWithSigil '$' x = x 210 makeVarWithSigil s x = Syn ( s:"{}") [x]210 makeVarWithSigil s x = Syn (cast (s:"{}")) [x] 211 211 212 212 -- | splits the string into expressions on whitespace. … … 215 215 doSplitStr f str = case f str of 216 216 [] -> Syn "," [] 217 [x] -> Val ( VStr x)218 xs -> Syn "," $ map (Val . VStr) xs217 [x] -> Val (_VStr x) 218 xs -> Syn "," $ map (Val . _VStr) xs 219 219 220 220 perl6Words :: String -> [String]
