Changeset 15297 for src/Pugs/Parser
- Timestamp:
- 02/18/07 15:59:02 (21 months ago)
- Location:
- src/Pugs/Parser
- Files:
-
- 8 modified
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Parser/Doc.hs
r15296 r15297 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
r15296 r15297 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
r15296 r15297 1 {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -foverloaded-strings#-}1 {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} 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 ( cast (shows sig "{}")) [exp]95 let appCast sig exp = Syn (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 s) -> do298 Val (VStr endMarker) -> 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 endMarker = cast s 302 foundEndMarker line 301 let foundEndMarker line 303 302 = (endMarker `isSuffixOf` line) 304 303 && (all isSpace (take (length line - length endMarker) line)) … … 348 347 string "q_to_eof()" 349 348 source <- many anyChar 350 return $ Val $ _VStr $ source349 return $ Val $ VStr $ source 351 350 352 351 qLiteral1 :: RuleParser String -- Opening delimiter … … 361 360 QS_Yes -> return (doSplitWords expr) 362 361 QS_Protect -> return $ case unwindGroups (unwindConcat (unwrap expr)) of 363 [] -> _Syn "," []362 [] -> Syn "," [] 364 363 [x] -> x 365 xs -> _Syn "," xs364 xs -> Syn "," xs 366 365 QS_No -> return $ case qfExecute flags of 367 366 True -> App (_Var "&Pugs::Internals::runShellCommand") Nothing [expr] … … 371 370 unwindConcat :: Exp -> [Exp] 372 371 unwindConcat (App _ Nothing [l, r]) = unwindConcat l ++ unwindConcat r 373 unwindConcat (Val (VStr buf))372 unwindConcat (Val (VStr str)) 374 373 | null str = [] 375 374 | otherwise = sepBegin (sepEnd (intersperse Noop splitted)) 376 375 where 377 splitted = map (Val . _VStr) (perl6Words str)376 splitted = map (Val . VStr) (perl6Words str) 378 377 sepBegin = if isBreakingSpace (head str) then (Noop:) else id 379 378 sepEnd = if isBreakingSpace (last str) then (++ [Noop]) else id 380 str = cast buf381 379 unwindConcat expr = [expr] 382 380 … … 399 397 -- a nonbreaking ws char. 400 398 doSplitWords expr 401 | Val (VStr str) <- unwrap expr = doSplitStr perl6Words (cast str)399 | Val (VStr str) <- unwrap expr = doSplitStr perl6Words str 402 400 | otherwise = Ann (Cxt cxtSlurpyAny) (App (_Var "&infix:~~") Nothing [expr, rxSplit]) 403 401 {- … … 412 410 ] 413 411 -} 414 rxSplit = _Syn "rx" $415 [ Val $ _VStr "([^\\x09\\x0a\\x0d\\x20]+)"412 rxSplit = Syn "rx" $ 413 [ Val $ VStr "([^\\x09\\x0a\\x0d\\x20]+)" 416 414 , Val $ VList 417 [ castV ( _VStr "P5", VInt 1)418 , castV ( _VStr "g", VInt 1)419 , castV ( _VStr "stringify", VInt 1)415 [ castV (VStr "P5", VInt 1) 416 , castV (VStr "g", VInt 1) 417 , castV (VStr "stringify", VInt 1) 420 418 ] 421 419 ] … … 572 570 True 573 571 | (App (Var var) Nothing [Val (VStr name), _]) <- pairs 574 , var == cast (__"&infix:=>")575 , ( castname ==) `any` words "P5 Perl5 perl5"572 , var == cast "&infix:=>" 573 , (name ==) `any` words "P5 Perl5 perl5" 576 574 ]) 577 575 = rxLiteral5 … … 643 641 = exp 644 642 applyPseudo (Syn syn [Var var, exp]) 645 | last (cast syn)== '='643 | last syn == '=' 646 644 , var == varTopic 647 = App (_Var ("&infix:" ++ init (cast syn))) Nothing [matchResult, exp]645 = App (_Var ("&infix:" ++ init syn)) Nothing [matchResult, exp] 648 646 applyPseudo x = internalError $ "Unknown pseudo-assignment form:" ++ show x 649 647 fixPseudo (Ann ann exp) = Ann ann (fixPseudo exp) … … 662 660 where 663 661 adv x (Syn "\\{}" [Syn "," pairs]) = Syn "\\{}" 664 [Syn "," (App (_Var "&infix:=>") Nothing [Val ( _VStr x), Val (VBool True)] : pairs)]662 [Syn "," (App (_Var "&infix:=>") Nothing [Val (VStr x), Val (VBool True)] : pairs)] 665 663 adv _ _ = internalError "unexpected regex adverb specifier" 666 664 -
src/Pugs/Parser/Operator.hs
r15296 r15297 1 {-# OPTIONS_GHC -cpp -fglasgow-exts -funbox-strict-fields -fno-full-laziness -fno-cse -fallow-overlapping-instances -fno-warn-orphans -foverloaded-strings#-}1 {-# OPTIONS_GHC -cpp -fglasgow-exts -funbox-strict-fields -fno-full-laziness -fno-cse -fallow-overlapping-instances -fno-warn-orphans #-} 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] 524 return $ \x z -> Syn syn [x, y, z] 525 526 527 525 528 526 529 emptyTerm :: Exp … … 705 708 char '|' 706 709 ruleHyperPost 707 return $ _cast "&prefix:|<<"710 return $ cast "&prefix:|<<" 708 711 709 712 ruleInfixOp :: RuleParser String -
src/Pugs/Parser/Program.hs
r15296 r15297 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
r15296 r15297 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
r15296 r15297 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 ++" }") (cast code)) of98 case envBody (parseProgram env ("MACRO { " ++ show pos ++" }") code) of 99 99 Val (err@VError{}) -> fail $ pretty err 100 100 exp -> return exp -
src/Pugs/Parser/Util.hs
r15296 r15297 1 {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -foverloaded-strings#-}1 {-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} 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 ( cast (s:"{}")) [x]210 makeVarWithSigil s x = Syn (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]
