亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cppifdef.hs

?? Haskell是一種程序語言。特別的
?? HS
字號:
-----------------------------------------------------------------------------
-- |
-- Module      :  CppIfdef
-- Copyright   :  1999-2004 Malcolm Wallace
-- Licence     :  LGPL
-- 
-- Maintainer  :  Malcolm Wallace <Malcolm.Wallace@cs.york.ac.uk>
-- Stability   :  experimental
-- Portability :  All
--
-- Perform a cpp.first-pass, gathering #define's and evaluating #ifdef's.
-- and #include's.
-----------------------------------------------------------------------------

module CppIfdef
  ( cppIfdef	-- :: FilePath -> [String] -> [String] -> Bool -> Bool
		--      -> String -> [(Posn,String)]
--  , preDefine	-- :: [String] -> SymTab String
  ) where


import SymTab
import ParseLib
-- import HashDefine
import Position  (Posn,newfile,newline,newlines,cppline,newpos)
import ReadFirst (readFirst)
import Tokenise  (linesCpp,reslash)
import Char      (isDigit)
import Numeric   (readHex,readOct,readDec)
import System.IO.Unsafe (unsafePerformIO)
import IO        (hPutStrLn,stderr)

-- | Run a first pass of cpp, evaluating #ifdef's and processing #include's,
--   whilst taking account of #define's and #undef's as we encounter them.
cppIfdef :: FilePath		-- ^ File for error reports
	-> [String]		-- ^ Pre-defined symbols
	-> [String]		-- ^ Search path for #includes
	-> Bool			-- ^ Leave #define and #undef in output?
	-> Bool			-- ^ Place #line droppings in output?
	-> String		-- ^ The input file content
	-> [(Posn,String)]	-- ^ The file after processing (in lines)
cppIfdef fp syms search leave locat =
    cpp posn defs search leave locat Keep . (cppline posn:) . linesCpp
  where
    posn = newfile fp
    defs = preDefine syms
-- Notice that the symbol table is a very simple one mapping strings
-- to strings.  This pass does not need anything more elaborate, in
-- particular it is not required to deal with any parameterised macros.


-- | Command-line definitions via -D are parsed here.
preDefine :: [String] -> SymTab String
preDefine defines =
    foldr (insertST.defval) emptyST defines
  where
    defval sym = let (s,d) = break (=='=') sym
                 in (s, if null d then "1" else tail d)


-- | Internal state for whether lines are being kept or dropped.
--   In @Drop n b@, @n@ is the depth of nesting, @b@ is whether
--   we have already succeeded in keeping some lines in a chain of
--   @elif@'s
data KeepState = Keep | Drop Int Bool

-- | Return just the list of lines that the real cpp would decide to keep.
cpp :: Posn -> SymTab String -> [String] -> Bool -> Bool -> KeepState
       -> [String] -> [(Posn,String)]
cpp _ _ _ _ _ _ [] = []

cpp p syms path leave ln Keep (l@('#':x):xs) =
    let ws = words x
        cmd = head ws
        sym = head (tail ws)
        rest = tail (tail ws)
        val  = maybe "1" id (un rest)
        un v = if null v then Nothing else Just (unwords v)
        down = if definedST sym syms then (Drop 1 False) else Keep
        up   = if definedST sym syms then Keep else (Drop 1 False)
        keep str = if gatherDefined p syms str then Keep else (Drop 1 False)
        skipn cpp' p' syms' path' ud xs' =
            let n = 1 + length (filter (=='\n') l) in
            (if leave then ((p,reslash l):) else (replicate n (p,"") ++)) $
            cpp' (newlines n p') syms' path' leave ln ud xs'
    in case cmd of
	"define" -> skipn cpp p (insertST (sym,val) syms) path Keep xs
	"undef"  -> skipn cpp p (deleteST sym syms) path Keep xs
	"ifndef" -> skipn cpp p syms path  down xs
	"ifdef"  -> skipn cpp p syms path  up   xs
	"if"     -> skipn cpp p syms path (keep (unwords (tail ws))) xs
	"else"   -> skipn cpp p syms path (Drop 1 False) xs
	"elif"   -> skipn cpp p syms path (Drop 1 True) xs
	"endif"  -> skipn cpp p syms path  Keep xs
	"pragma" -> skipn cpp p syms path  Keep xs
	"include"-> let (inc,content) =
	                  unsafePerformIO (readFirst (unwords (tail ws))
                                                     p path syms)
	            in
		    cpp p syms path leave ln Keep (("#line 1 "++show inc)
                                                  : linesCpp content
                                                  ++ cppline p :"": xs)
	"warning"-> unsafePerformIO $ do
                       hPutStrLn stderr (l++"\nin "++show p)
                       return $ skipn cpp p syms path  Keep xs
	"error"  -> error (l++"\nin "++show p)
	"line" | all isDigit sym
	         -> (if ln then ((p,l):) else id) $
                    cpp (newpos (read sym) (un rest) p)
                        syms path leave ln Keep xs
	n | all isDigit n
	         -> (if ln then ((p,l):) else id) $
	            cpp (newpos (read n) (un (tail ws)) p)
                        syms path leave ln Keep xs
          | otherwise
	         -> error ("Unknown directive #"++cmd++"\nin "++show p)

cpp p syms path leave ln (Drop n b) (('#':x):xs) =
    let ws = words x
        cmd = head ws
        delse    | n==1 && b = Drop 1 b
                 | n==1      = Keep
                 | otherwise = Drop n b
        dend     | n==1      = Keep
                 | otherwise = Drop (n-1) b
        keep str | n==1      = if gatherDefined p syms str then Keep
                               else (Drop 1) b
                 | otherwise = Drop n b
        skipn cpp' p' syms' path' ud xs' =
                 let n' = 1 + length (filter (=='\n') x) in
                 replicate n' (p,"")
                 ++ cpp' (newlines n' p') syms' path' leave ln ud xs'
    in
    if      cmd == "ifndef" ||
            cmd == "if"     ||
            cmd == "ifdef"  then  skipn cpp p syms path (Drop (n+1) b) xs
    else if cmd == "elif"   then  skipn cpp p syms path
                                                  (keep (unwords (tail ws))) xs
    else if cmd == "else"   then  skipn cpp p syms path delse xs
    else if cmd == "endif"  then  skipn cpp p syms path dend xs
    else skipn cpp p syms path (Drop n b) xs
	-- define, undef, include, error, warning, pragma, line

cpp p syms path leave ln Keep (x:xs) =
    let p' = newline p in seq p' $
    (p,x):  cpp p' syms path leave ln Keep xs
cpp p syms path leave ln d@(Drop _ _) (_:xs) =
    let p' = newline p in seq p' $
    (p,""): cpp p' syms path leave ln d xs


----
gatherDefined :: Posn -> SymTab String -> String -> Bool
gatherDefined p st inp =
  case papply (parseBoolExp st) inp of
    []      -> error ("Cannot parse #if directive in file "++show p)
    [(b,_)] -> b
    _       -> error ("Ambiguous parse for #if directive in file "++show p)

parseBoolExp :: SymTab String -> Parser Bool
parseBoolExp st =
  do  a <- parseExp1 st
      skip (string "||")
      b <- first (skip (parseBoolExp st))
      return (a || b)
  +++
      parseExp1 st

parseExp1 :: SymTab String -> Parser Bool
parseExp1 st =
  do  a <- parseExp0 st
      skip (string "&&")
      b <- first (skip (parseExp1 st))
      return (a && b)
  +++
      parseExp0 st

parseExp0 :: SymTab String -> Parser Bool
parseExp0 st =
  do  skip (string "defined")
      sym <- bracket (skip (char '(')) (skip (many1 alphanum)) (skip (char ')'))
      return (definedST sym st)
  +++
  do  bracket (skip (char '(')) (parseBoolExp st) (skip (char ')'))
  +++
  do  skip (char '!')
      a <- parseExp0 st
      return (not a)
  +++
  do  sym1 <- skip (many1 alphanum)
      op <- parseOp st
      sym2 <- skip (many1 alphanum)
      let val1 = convert sym1 st
      let val2 = convert sym2 st
      return (op val1 val2)
  +++
  do  sym <- skip (many1 alphanum)
      case convert sym st of
        0 -> return False
        _ -> return True
  where
    convert sym st' =
      case lookupST sym st' of
        Nothing  -> safeRead sym
        (Just a) -> safeRead a
    safeRead s =
      case s of
        '0':'x':s' -> number readHex s'
        '0':'o':s' -> number readOct s'
        _          -> number readDec s
    number rd s =
      case rd s of
        []        -> 0 :: Integer
        ((n,_):_) -> n :: Integer

parseOp :: SymTab String -> Parser (Integer -> Integer -> Bool)
parseOp _ =
  do  skip (string ">=")
      return (>=)
  +++
  do  skip (char '>')
      return (>)
  +++
  do  skip (string "<=")
      return (<=)
  +++
  do  skip (char '<')
      return (<)
  +++
  do  skip (string "==")
      return (==)
  +++
  do  skip (string "!=")
      return (/=)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产一区二区三区香蕉| 日本一区二区三区国色天香| 色8久久精品久久久久久蜜| 国产不卡高清在线观看视频| 国产做a爰片久久毛片| 激情五月激情综合网| 国产一区二区在线免费观看| 国产一区二区h| 国产69精品一区二区亚洲孕妇| 国产精品99久久久久久久vr| 成人a免费在线看| 成人不卡免费av| 97se狠狠狠综合亚洲狠狠| 一本大道av伊人久久综合| 色呦呦日韩精品| 欧美日韩一区二区三区视频| 7777精品伊人久久久大香线蕉 | 日本不卡视频在线观看| 日本中文字幕一区| 毛片av一区二区| 国产精品一二三区| 成人h版在线观看| 欧美伊人久久久久久久久影院| 欧美浪妇xxxx高跟鞋交| 欧美电影免费提供在线观看| 国产欧美一区二区精品性| 综合久久综合久久| 亚洲成人在线观看视频| 极品少妇一区二区| 成人性生交大合| 一本一本大道香蕉久在线精品| 欧美日韩一区二区三区不卡 | 国产精品美女www爽爽爽| 亚洲人午夜精品天堂一二香蕉| 亚洲一区二区精品视频| 美国一区二区三区在线播放| 成人免费高清在线| 欧美亚洲图片小说| 精品对白一区国产伦| 国产精品每日更新在线播放网址| 亚洲高清在线视频| 国产精品一级片在线观看| 91久久国产最好的精华液| 日韩视频免费观看高清完整版在线观看 | 国产精品丝袜在线| 亚洲一区二区三区影院| 国产真实乱子伦精品视频| 91色.com| 欧美xxxxx裸体时装秀| 亚洲精品国产精品乱码不99| 青青草原综合久久大伊人精品优势| 成人一区二区三区视频| 欧美日韩国产小视频| 欧美激情在线观看视频免费| 午夜精品免费在线| 成人福利电影精品一区二区在线观看| 欧美性感一类影片在线播放| 久久久久久久久伊人| 亚州成人在线电影| 国产69精品久久久久毛片| 7878成人国产在线观看| 亚洲欧美另类久久久精品| 久久av中文字幕片| 欧美日韩一级黄| 亚洲国产精品t66y| 精品一区二区三区在线视频| 在线视频综合导航| 欧美国产禁国产网站cc| 美日韩一区二区| 91精品91久久久中77777| 日本一区二区三区在线不卡| 日韩国产高清影视| 欧美中文一区二区三区| 中文字幕 久热精品 视频在线| 奇米影视在线99精品| 欧美伊人久久久久久午夜久久久久| 欧美国产亚洲另类动漫| 六月丁香婷婷久久| 欧美日韩情趣电影| 亚洲三级在线免费| 成人app软件下载大全免费| 精品日本一线二线三线不卡| 午夜激情一区二区| 欧洲一区二区三区免费视频| 国产精品久99| 国产成都精品91一区二区三| 久久亚洲精品国产精品紫薇| 麻豆中文一区二区| 777午夜精品免费视频| 亚洲一区二区高清| 91九色最新地址| 亚洲欧美另类小说| 色域天天综合网| 亚洲欧美另类久久久精品 | 国产欧美一区二区精品忘忧草| 免费在线视频一区| 日韩午夜av一区| 日韩精品一二三四| 欧美一区二区三区在| 天天影视涩香欲综合网| 欧美精品v国产精品v日韩精品| 亚洲一区二区三区精品在线| 欧美性大战久久久| 亚洲成人动漫一区| 制服丝袜中文字幕亚洲| 日韩中文欧美在线| 欧美一级淫片007| 青青草97国产精品免费观看| 欧美一二三四区在线| 韩国一区二区三区| 久久久久亚洲蜜桃| 高清在线不卡av| 中文字幕亚洲区| 91美女精品福利| 亚洲午夜免费福利视频| 69堂精品视频| 久久9热精品视频| 中文字幕乱码久久午夜不卡| 成人av网在线| 亚洲日本乱码在线观看| 欧美天天综合网| 日本美女视频一区二区| 欧美精品一区二区精品网| 国产精品69久久久久水密桃| 中文字幕中文字幕在线一区| 在线精品国精品国产尤物884a| 亚洲第一福利视频在线| 欧美一级高清片在线观看| 国产黄色成人av| 成人欧美一区二区三区白人| 欧洲精品在线观看| 人人狠狠综合久久亚洲| 久久久精品免费免费| 色婷婷综合视频在线观看| 五月天视频一区| 久久久久久99久久久精品网站| av欧美精品.com| 亚洲国产乱码最新视频| 欧美成人精精品一区二区频| 成人免费视频视频在线观看免费 | 日本麻豆一区二区三区视频| 国产午夜亚洲精品羞羞网站| 99久久99久久精品国产片果冻| 性久久久久久久久| 国产精品色在线| 欧美群妇大交群的观看方式 | 精品国产乱码久久久久久牛牛 | 精品国产sm最大网站免费看| 国产成人综合亚洲网站| 一区二区三区精品视频在线| 日韩三级高清在线| 99久久99久久久精品齐齐| 蜜臀av一区二区| 国产精品久久毛片| 欧美日韩卡一卡二| 不卡视频在线看| 久久精品理论片| 亚洲欧美日韩一区二区 | 日韩中文字幕一区二区三区| 国产人伦精品一区二区| 欧美日韩一区二区不卡| 成人综合婷婷国产精品久久免费| 午夜电影网亚洲视频| 国产精品不卡在线观看| 精品成人私密视频| 欧美日韩国产天堂| 97se狠狠狠综合亚洲狠狠| 精品一区二区三区香蕉蜜桃| 亚洲一区二区三区国产| 国产精品久久毛片| 久久婷婷成人综合色| 538prom精品视频线放| 91久久精品一区二区三区| 成人深夜福利app| 正在播放一区二区| 色又黄又爽网站www久久| 高清成人在线观看| 久久成人免费电影| 午夜国产精品影院在线观看| 亚洲精品日日夜夜| 中文字幕免费不卡| 久久久综合网站| 日韩视频免费观看高清完整版在线观看| 日本道精品一区二区三区 | 91精品福利在线一区二区三区| 91一区二区三区在线播放| 国产精品资源在线| 国产在线播放一区三区四| 日本欧美一区二区在线观看| 午夜一区二区三区视频| 亚洲精品国产无天堂网2021| 中文字幕一区二区三区av| 国产亚洲一本大道中文在线| 日韩精品最新网址| 日韩久久久久久| 欧美精品九九99久久| 欧美日韩精品电影| 欧美午夜精品久久久久久孕妇 | 欧美一区二区久久久| 欧美挠脚心视频网站|