mirror of
https://github.com/GaloisInc/cryptol.git
synced 2024-12-02 23:25:03 +03:00
Add parsing for binary and octal fractional literals.
I doubt these are super common but we add them for completeness, and because with the floats we can print in those bases
This commit is contained in:
parent
173a04fc01
commit
42b2ac6b45
@ -285,7 +285,9 @@ data NumInfo = BinLit Int -- ^ n-digit binary literal
|
|||||||
deriving (Eq, Show, Generic, NFData)
|
deriving (Eq, Show, Generic, NFData)
|
||||||
|
|
||||||
-- | Information about fractional literals.
|
-- | Information about fractional literals.
|
||||||
data FracInfo = DecFrac
|
data FracInfo = BinFrac
|
||||||
|
| OctFrac
|
||||||
|
| DecFrac
|
||||||
| HexFrac
|
| HexFrac
|
||||||
deriving (Eq,Show,Generic,NFData)
|
deriving (Eq,Show,Generic,NFData)
|
||||||
|
|
||||||
@ -644,13 +646,15 @@ ppFracLit :: Rational -> FracInfo -> Doc
|
|||||||
ppFracLit x i
|
ppFracLit x i
|
||||||
| toRational dbl == x =
|
| toRational dbl == x =
|
||||||
case i of
|
case i of
|
||||||
|
BinFrac -> frac
|
||||||
|
OctFrac -> frac
|
||||||
DecFrac -> text (showFloat dbl "")
|
DecFrac -> text (showFloat dbl "")
|
||||||
HexFrac -> text (showHFloat dbl "")
|
HexFrac -> text (showHFloat dbl "")
|
||||||
| otherwise =
|
| otherwise = frac
|
||||||
"fraction`" <.> braces
|
|
||||||
(commaSep (map integer [ numerator x, denominator x ]))
|
|
||||||
where
|
where
|
||||||
dbl = fromRational x :: Double
|
dbl = fromRational x :: Double
|
||||||
|
frac = "fraction`" <.> braces
|
||||||
|
(commaSep (map integer [ numerator x, denominator x ]))
|
||||||
|
|
||||||
|
|
||||||
ppNumLit :: Integer -> NumInfo -> Doc
|
ppNumLit :: Integer -> NumInfo -> Doc
|
||||||
|
@ -45,11 +45,15 @@ $unitick = \x7
|
|||||||
@qual_id = @qual @id
|
@qual_id = @qual @id
|
||||||
@qual_op = @qual @op
|
@qual_op = @qual @op
|
||||||
|
|
||||||
@num2 = "0b" (_*[0-1])+
|
@digits2 = (_*[0-1])+
|
||||||
@num8 = "0o" (_*[0-7])+
|
@digits8 = (_*[0-7])+
|
||||||
@num10 = [0-9](_*[0-9])*
|
|
||||||
@digits16 = (_*[0-9A-Fa-f])+
|
@digits16 = (_*[0-9A-Fa-f])+
|
||||||
|
@num2 = "0b" @digits2
|
||||||
|
@num8 = "0o" @digits8
|
||||||
|
@num10 = [0-9](_*[0-9])*
|
||||||
@num16 = "0x" @digits16
|
@num16 = "0x" @digits16
|
||||||
|
@fnum2 = @num2 "." @digits2 ([pP] [\+\-]? @num10)?
|
||||||
|
@fnum8 = @num8 "." @digits8 ([pP] [\+\-]? @num10)?
|
||||||
@fnum10 = @num10 "." @num10 ([eE] [\+\-]? @num10)?
|
@fnum10 = @num10 "." @num10 ([eE] [\+\-]? @num10)?
|
||||||
@fnum16 = @num16 "." @digits16 ([pP] [\+\-]? @num10)?
|
@fnum16 = @num16 "." @digits16 ([pP] [\+\-]? @num10)?
|
||||||
|
|
||||||
@ -130,6 +134,8 @@ $white+ { emit $ White Space }
|
|||||||
@num8 { emitS (numToken 8 . Text.drop 2) }
|
@num8 { emitS (numToken 8 . Text.drop 2) }
|
||||||
@num10 { emitS (numToken 10 . Text.drop 0) }
|
@num10 { emitS (numToken 10 . Text.drop 0) }
|
||||||
@num16 { emitS (numToken 16 . Text.drop 2) }
|
@num16 { emitS (numToken 16 . Text.drop 2) }
|
||||||
|
@fnum2 { emitS (fnumToken 2 . Text.drop 2) }
|
||||||
|
@fnum8 { emitS (fnumToken 8 . Text.drop 2) }
|
||||||
@fnum10 { emitS (fnumToken 10 . Text.drop 0) }
|
@fnum10 { emitS (fnumToken 10 . Text.drop 0) }
|
||||||
@fnum16 { emitS (fnumToken 16 . Text.drop 2) }
|
@fnum16 { emitS (fnumToken 16 . Text.drop 2) }
|
||||||
|
|
||||||
|
@ -214,6 +214,8 @@ fracLit :: TokenT -> Expr PName
|
|||||||
fracLit tok =
|
fracLit tok =
|
||||||
case tok of
|
case tok of
|
||||||
Frac x base
|
Frac x base
|
||||||
|
| base == 2 -> ELit $ ECFrac x BinFrac
|
||||||
|
| base == 8 -> ELit $ ECFrac x OctFrac
|
||||||
| base == 10 -> ELit $ ECFrac x DecFrac
|
| base == 10 -> ELit $ ECFrac x DecFrac
|
||||||
| base == 16 -> ELit $ ECFrac x HexFrac
|
| base == 16 -> ELit $ ECFrac x HexFrac
|
||||||
_ -> panic "[Parser] fracLit" [ "Invalid fraction", show tok ]
|
_ -> panic "[Parser] fracLit" [ "Invalid fraction", show tok ]
|
||||||
|
@ -127,6 +127,8 @@ desugarLiteral lit =
|
|||||||
let arg f = P.PosInst (P.TNum (f fr))
|
let arg f = P.PosInst (P.TNum (f fr))
|
||||||
rnd = P.PosInst (P.TNum (case info of
|
rnd = P.PosInst (P.TNum (case info of
|
||||||
P.DecFrac -> 0
|
P.DecFrac -> 0
|
||||||
|
P.BinFrac -> 1
|
||||||
|
P.OctFrac -> 1
|
||||||
P.HexFrac -> 1))
|
P.HexFrac -> 1))
|
||||||
in P.EAppT fracPrim [ arg numerator, arg denominator, rnd ]
|
in P.EAppT fracPrim [ arg numerator, arg denominator, rnd ]
|
||||||
|
|
||||||
|
13
tests/regression/frac_lit.icry
Normal file
13
tests/regression/frac_lit.icry
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
0b1.1 : Rational
|
||||||
|
0o1.1 : Rational
|
||||||
|
1.1 : Rational
|
||||||
|
0x1.1 : Rational
|
||||||
|
0b1.1p3 : Rational
|
||||||
|
0o1.1p3 : Rational
|
||||||
|
1.1e3 : Rational
|
||||||
|
0x1.1p3 : Rational
|
||||||
|
0b1.1p-3 : Rational
|
||||||
|
0o1.1p-3 : Rational
|
||||||
|
1.1e-3 : Rational
|
||||||
|
0x1.1p-3 : Rational
|
||||||
|
|
13
tests/regression/frac_lit.icry.stdout
Normal file
13
tests/regression/frac_lit.icry.stdout
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
Loading module Cryptol
|
||||||
|
(ratio 3 2)
|
||||||
|
(ratio 9 8)
|
||||||
|
(ratio 11 10)
|
||||||
|
(ratio 17 16)
|
||||||
|
(ratio 12 1)
|
||||||
|
(ratio 9 1)
|
||||||
|
(ratio 1100 1)
|
||||||
|
(ratio 17 2)
|
||||||
|
(ratio 3 16)
|
||||||
|
(ratio 9 64)
|
||||||
|
(ratio 11 10000)
|
||||||
|
(ratio 17 128)
|
Loading…
Reference in New Issue
Block a user