@@ -16,12 +16,15 @@ import Control.Monad.Except
1616import Data. Char ( isSpace, toLower)
1717import Data. List ( dropWhileEnd)
1818import Data. Char ( chr )
19- import Numeric ( readDec )
19+ import Numeric ( readDec, readBin, readOct, readHex )
2020import Control. Monad ( when)
2121}
2222
2323% wrapper "monadUserState"
2424
25+ $bindigit = [ 01]
26+ $ octdigit = 0-7
27+ $ hexdigit = [ 0- 9A- Fa- f]
2528$ digit = 0-9
2629$ alpha = [ a- zA- Z]
2730$ alpha_ = [ $alpha \_ ]
@@ -30,7 +33,10 @@ $graphic = $printable # $white
3033@sym = $ alpha_ [ $alpha $digit \_ \' ] *
3134@string = \" ($ printable # \" )* \"
3235@label = \`\{ ($ printable # \} )* \}\`
33-
36+ @declit = $ digit[ \_ $digit] *
37+ @binlit = 0[ bB] $ bindigit[ \_ $bindigit] *
38+ @octlit = 0[ oO] $ octdigit[ \_ $octdigit] *
39+ @hexlit = 0[ xX] $ hexdigit[ \_ $hexdigit] *
3440
3541tokens:-
3642-- Whitespace insensitive
@@ -109,7 +115,12 @@ tokens:-
109115<state_dclabel> "#root-integrity" { mkL TokenDCRootInteg }
110116<state_dclabel> "#null-confidentiality" { mkL TokenDCNullConf }
111117<state_dclabel> "#null-integrity" { mkL TokenDCNullInteg }
112- <0> $ digit+ { mkLs (\s -> TokenNum ( read s)) }
118+ -- Integer literal parsing inspired by https:// github.com/ocaml/ocaml/blob/trunk/parsing/lexer.mll
119+ <0> @declit { mkLs (\s -> TokenNum ( read ( filter (/ ='_') s))) }
120+ <0> @binlit { mkLs (\s -> TokenNum ( fst ( head ( readBin ( filter (/ ='_') ( drop 2 s)))))) }
121+ <0> @octlit { mkLs (\s -> TokenNum ( fst ( head ( readOct ( filter (/ ='_') ( drop 2 s)))))) }
122+ <0> @hexlit { mkLs (\s -> TokenNum ( fst ( head ( readHex ( filter (/ ='_') ( drop 2 s)))))) }
123+ <0> ( @declit| @binlit| @octlit| @hexlit) @sym { \( _, _, _, s) _ -> lexerError ( "Invalid literal " ++ s) }
113124<0> [ \< ][ \< ] { mkL TokenBinShiftLeft }
114125<0> [ \> ][ \> ] { mkL TokenBinShiftRight }
115126<0> [ \~ ][ \> ][ \> ] { mkL TokenBinZeroShiftRight }
@@ -386,9 +397,6 @@ lexerError msg =
386397 where
387398 trim = reverse . dropWhile ( == ' ') . reverse . dropWhile ( == ' ')
388399
389-
390-
391-
392400-- we use a custom version of monadScan so that we have full
393401-- control over the error reporting; this one is based on
394402-- the built-in alexMonadScan
0 commit comments