use crate::parse::builder::GrammarBuilder;
use crate::types::CharClass;
use super::classes;
#[inline]
fn digits1(g: &mut GrammarBuilder, digit: CharClass, label: &str) {
g.consume_while_class1_with_label(digit, label);
}
#[inline]
fn digits0_uscore(g: &mut GrammarBuilder, digit: CharClass, label: &str) {
g.zero_or_more(|g| {
g.choice(
|g| {
g.class_with_label(digit, label);
},
|g| {
g.byte(b'_');
g.class_with_label(digit, label);
},
);
});
}
#[inline]
fn digits1_uscore(g: &mut GrammarBuilder, digit: CharClass, label: &str) {
g.class_with_label(digit, label);
digits0_uscore(g, digit, label);
}
#[inline]
pub fn dec_digits1(g: &mut GrammarBuilder) {
digits1(g, classes::DIGIT, "digit");
}
#[inline]
pub fn hex_digits1(g: &mut GrammarBuilder) {
digits1(g, classes::HEX_DIGIT, "hex digit");
}
#[inline]
pub fn dec_digits1_uscore(g: &mut GrammarBuilder) {
digits1_uscore(g, classes::DIGIT, "digit");
}
#[inline]
pub fn hex_digits1_uscore(g: &mut GrammarBuilder) {
digits1_uscore(g, classes::HEX_DIGIT, "hex digit");
}
#[inline]
pub fn bin_digits1(g: &mut GrammarBuilder) {
digits1(g, classes::BIN_DIGIT, "binary digit");
}
#[inline]
pub fn oct_digits1(g: &mut GrammarBuilder) {
digits1(g, classes::OCT_DIGIT, "octal digit");
}
#[inline]
pub fn bin_digits1_uscore(g: &mut GrammarBuilder) {
digits1_uscore(g, classes::BIN_DIGIT, "binary digit");
}
#[inline]
pub fn oct_digits1_uscore(g: &mut GrammarBuilder) {
digits1_uscore(g, classes::OCT_DIGIT, "octal digit");
}
pub fn number_json(g: &mut GrammarBuilder) {
g.optional(|g| {
g.byte(b'-');
});
g.choice(
|g| {
g.byte(b'0');
},
|g| {
g.class(CharClass::EMPTY.with_range(b'1', b'9'));
g.zero_or_more(|g| {
g.class(classes::DIGIT);
});
},
);
g.optional(|g| {
g.byte(b'.');
dec_digits1(g);
});
g.optional(|g| {
g.byte_either(b'e', b'E');
g.optional(|g| {
g.byte_either(b'+', b'-');
});
dec_digits1(g);
});
}
pub fn number_json_uscore(g: &mut GrammarBuilder) {
g.optional(|g| {
g.byte(b'-');
});
g.choice(
|g| {
g.byte(b'0');
},
|g| {
g.class(CharClass::EMPTY.with_range(b'1', b'9'));
digits0_uscore(g, classes::DIGIT, "digit");
},
);
g.optional(|g| {
g.byte(b'.');
dec_digits1_uscore(g);
});
g.optional(|g| {
g.byte_either(b'e', b'E');
g.optional(|g| {
g.byte_either(b'+', b'-');
});
dec_digits1_uscore(g);
});
}