yi-language 0.13 → 0.13.0.1
raw patch · 2 files changed
+91/−1 lines, 2 files
Files
- src/Yi/Lexer/common.hsinc +87/−0
- yi-language.cabal +4/−1
+ src/Yi/Lexer/common.hsinc view
@@ -0,0 +1,87 @@+-- -*- Haskell -*-++-- The include file for alex-generated syntax highlighters. Because alex+-- declares its own types, any wrapper must have the highlighter in scope...+-- so it must be included. Doubleplusyuck.++#define IBOX(n) (I# (n))++#define GEQ_(x, y) (tagToEnum# (x >=# y))+#define EQ_(x, y) (tagToEnum# (x ==# y))++-- | Scan one token. Return (maybe) a token and a new state.+alexScanToken :: (AlexState HlState, AlexInput) -> Maybe (Tok Token, (AlexState HlState, AlexInput))+alexScanToken (AlexState state lookedOfs pos, inp@(_prevCh,_bs,str)) =+ let (scn,lookahead) = alexScanUser' state inp (stateToInit state)+ lookedOfs' = max lookedOfs (posnOfs pos +~ Size lookahead) in+ case scn of+ AlexEOF -> Nothing+ AlexError inp' -> Nothing+ AlexSkip inp' len ->+ let chunk = take (fromIntegral len) str+ in alexScanToken (AlexState state lookedOfs' (moveStr pos chunk), inp')+ AlexToken inp' len act ->+ let (state', tokValue) = act chunk state+ chunk = take (fromIntegral len) str+ newPos = moveStr pos chunk+ in Just (Tok tokValue (posnOfs newPos ~- posnOfs pos) pos, (AlexState state' lookedOfs' newPos, inp'))++alexScan' input (I# (sc))+ = alexScanUser' undefined input (I# (sc))++alexScanUser' user input (I# (sc))+ = case alex_scan_tkn' user input 0# input sc AlexNone of+ (AlexNone, input', lookahead) ->+ case alexGetByte input of+ Nothing -> (AlexEOF, lookahead)+ Just _ -> (AlexError input', lookahead)+ (AlexLastSkip input'' len, _, lookahead) -> (AlexSkip input'' len, lookahead)+ (AlexLastAcc k input'' len, _, lookahead) -> (AlexToken input'' len k, lookahead)+++-- Same as alex_scan_tkn, but also return the length of lookahead.+alex_scan_tkn' user orig_input len input s last_acc =+ input `seq` -- strict in the input+ let new_acc = check_accs (alex_accept `quickIndex` IBOX(s)) in+ new_acc `seq`+ case alexGetByte input of+ Nothing -> (new_acc, input, IBOX(len))+ Just (c, new_input) ->+ let base = alexIndexInt32OffAddr alex_base s+ ord_c = case fromIntegral c of (I# x) -> x+ offset = (base +# ord_c)+ check = alexIndexInt16OffAddr alex_check offset++ new_s = if GEQ_(offset, 0#) && EQ_(check, ord_c)+ then alexIndexInt16OffAddr alex_table offset+ else alexIndexInt16OffAddr alex_deflt s+ new_len = if c < 0x80 || c >= 0xC0 then len +# 1# else len+ in case new_s of+ -1# -> (new_acc, input, IBOX(new_len))+ -- on an error, we want to keep the input *before* the+ -- character that failed, not after.+ -- (but still, we looked after)+ _ -> alex_scan_tkn' user orig_input new_len new_input new_s new_acc++ where+ check_accs (AlexAccNone) = last_acc+ check_accs (AlexAcc a ) = AlexLastAcc a input IBOX(len)+ check_accs (AlexAccSkip) = AlexLastSkip input IBOX(len)+#ifndef NO_ALEX_CONTEXTS+ check_accs (AlexAccPred a predx rest)+ | predx user orig_input IBOX(len) input+ = AlexLastAcc a input IBOX(len)+ | otherwise+ = check_accs rest+ check_accs (AlexAccSkipPred predx rest)+ | predx user orig_input IBOX(len) input+ = AlexLastSkip input IBOX(len)+ | otherwise+ = check_accs rest+#endif+++c = actionConst+m = actionAndModify+ms = actionStringAndModify+cs = actionStringConst
yi-language.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: yi-language-version: 0.13+version: 0.13.0.1 synopsis: Collection of language-related Yi libraries. category: Yi homepage: https://github.com/yi-editor/yi#readme@@ -12,6 +12,9 @@ license: GPL-2 build-type: Simple cabal-version: >= 1.10++extra-source-files:+ src/Yi/Lexer/common.hsinc source-repository head type: git