This commit is contained in:
parent
6ce5d526a3
commit
4f5c94891a
2 changed files with 51 additions and 1 deletions
|
@ -44,6 +44,10 @@ pub boolean -> Value =
|
||||||
"false" { Value::Boolean(false) }
|
"false" { Value::Boolean(false) }
|
||||||
|
|
||||||
digit = [0-9]
|
digit = [0-9]
|
||||||
|
alphanumeric = [0-9a-zA-Z]
|
||||||
|
octaldigit = [0-7]
|
||||||
|
validbase = [3][0-6] / [12][0-9] / [2-9]
|
||||||
|
hex = [0-9a-fA-F]
|
||||||
sign = "-" / "+"
|
sign = "-" / "+"
|
||||||
|
|
||||||
pub bigint -> Value =
|
pub bigint -> Value =
|
||||||
|
@ -51,6 +55,22 @@ pub bigint -> Value =
|
||||||
Value::BigInteger(b.parse::<BigInt>().unwrap())
|
Value::BigInteger(b.parse::<BigInt>().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub octalinteger -> Value =
|
||||||
|
"0" i:$( octaldigit+ ) {
|
||||||
|
Value::Integer(i64::from_str_radix(i, 8).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub hexinteger -> Value =
|
||||||
|
"0x" i:$( hex+ ) {
|
||||||
|
Value::Integer(i64::from_str_radix(i, 16).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub basedinteger -> Value =
|
||||||
|
// Only allow values 2-36
|
||||||
|
b:$( validbase ) "r" i:$( alphanumeric+ ) {
|
||||||
|
Value::Integer(i64::from_str_radix(i, b.parse::<u32>().unwrap()).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
pub integer -> Value =
|
pub integer -> Value =
|
||||||
i:$( sign? digit+ ) {
|
i:$( sign? digit+ ) {
|
||||||
Value::Integer(i.parse::<i64>().unwrap())
|
Value::Integer(i.parse::<i64>().unwrap())
|
||||||
|
@ -134,7 +154,7 @@ pub map -> Value =
|
||||||
// It's important that float comes before integer or the parser assumes that
|
// It's important that float comes before integer or the parser assumes that
|
||||||
// floats are integers and fails to parse
|
// floats are integers and fails to parse
|
||||||
pub value -> Value =
|
pub value -> Value =
|
||||||
__ v:(nil / nan / infinity / boolean / float / bigint / integer / text / keyword / symbol / list / vector / map / set) __ {
|
__ v:(nil / nan / infinity / boolean / float / octalinteger / hexinteger / basedinteger / bigint / integer / text / keyword / symbol / list / vector / map / set) __ {
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,33 @@ fn test_integer() {
|
||||||
assert!(integer("nil").is_err());
|
assert!(integer("nil").is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hexinteger() {
|
||||||
|
assert_eq!(hexinteger("0xabc111").unwrap(), Integer(11256081));
|
||||||
|
assert_eq!(hexinteger("0xABCDEF").unwrap(), Integer(11259375));
|
||||||
|
assert_eq!(hexinteger("0xabcdef").unwrap(), Integer(11259375));
|
||||||
|
|
||||||
|
assert!(hexinteger("nil").is_err());
|
||||||
|
assert!(hexinteger("0xZZZ").is_err());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_basedinteger() {
|
||||||
|
assert_eq!(basedinteger("2r111").unwrap(), Integer(7));
|
||||||
|
assert_eq!(basedinteger("36r1z").unwrap(), Integer(71));
|
||||||
|
assert_eq!(basedinteger("36r1Z").unwrap(), Integer(71));
|
||||||
|
assert_eq!(basedinteger("12r11").unwrap(), Integer(13));
|
||||||
|
assert_eq!(basedinteger("24r10").unwrap(), Integer(24));
|
||||||
|
|
||||||
|
assert!(basedinteger("nil").is_err());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_octalinteger() {
|
||||||
|
assert_eq!(octalinteger("011").unwrap(), Integer(9));
|
||||||
|
assert_eq!(octalinteger("00107").unwrap(), Integer(71));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bigint() {
|
fn test_bigint() {
|
||||||
let max_i64 = i64::max_value().to_bigint().unwrap();
|
let max_i64 = i64::max_value().to_bigint().unwrap();
|
||||||
|
@ -186,6 +213,9 @@ fn test_value() {
|
||||||
assert_eq!(value("[1]").unwrap(), Vector(vec![Integer(1)]));
|
assert_eq!(value("[1]").unwrap(), Vector(vec![Integer(1)]));
|
||||||
assert_eq!(value("111.222").unwrap(), Float(OrderedFloat(111.222f64)));
|
assert_eq!(value("111.222").unwrap(), Float(OrderedFloat(111.222f64)));
|
||||||
assert_eq!(value("85070591730234615847396907784232501249N").unwrap(), BigInteger(bigger));
|
assert_eq!(value("85070591730234615847396907784232501249N").unwrap(), BigInteger(bigger));
|
||||||
|
assert_eq!(value("0xabc111").unwrap(), Integer(11256081));
|
||||||
|
assert_eq!(value("2r111").unwrap(), Integer(7));
|
||||||
|
assert_eq!(value("011").unwrap(), Integer(9));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in a new issue