FastWaveBackend/src/vcd/parse/combinator_atoms.rs

79 lines
1.8 KiB
Rust
Raw Normal View History

2022-08-11 21:35:40 +00:00
use super::reader::{next_word, WordReader};
2022-06-19 13:44:57 +00:00
use super::types::ParseResult;
2022-08-11 21:35:40 +00:00
pub(super) fn digit(chr: u8) -> bool {
2022-06-19 13:44:57 +00:00
let zero = b'0' as u8;
let nine = b'9' as u8;
let between_zero_and_nine = (chr >= zero) && (nine >= chr);
2022-08-11 21:35:40 +00:00
return between_zero_and_nine;
2022-06-19 13:44:57 +00:00
}
2022-08-11 21:35:40 +00:00
pub(super) fn take_until<'a>(word: &'a str, pattern: u8) -> ParseResult<'a> {
let mut new_start = 0;
2022-06-19 13:44:57 +00:00
for chr in word.as_bytes() {
2022-08-02 23:31:35 +00:00
if *chr == pattern {
2022-08-11 21:35:40 +00:00
break;
} else {
2022-06-19 13:44:57 +00:00
new_start += 1;
}
}
2022-08-11 21:35:40 +00:00
return ParseResult {
matched: &word[0..new_start],
residual: &word[new_start..],
};
2022-06-19 13:44:57 +00:00
}
2022-08-11 21:35:40 +00:00
pub(super) fn take_while<'a>(word: &'a str, cond: fn(u8) -> bool) -> ParseResult<'a> {
let mut new_start = 0;
2022-06-19 13:44:57 +00:00
for chr in word.as_bytes() {
2022-08-02 23:31:35 +00:00
if cond(*chr) {
2022-06-19 13:44:57 +00:00
new_start += 1;
2022-08-11 21:35:40 +00:00
} else {
break;
2022-06-19 13:44:57 +00:00
}
}
2022-08-11 21:35:40 +00:00
return ParseResult {
matched: &word[0..new_start],
residual: &word[new_start..],
};
2022-06-19 13:44:57 +00:00
}
2022-08-11 21:35:40 +00:00
pub(super) fn tag<'a>(word: &'a str, pattern: &'a str) -> ParseResult<'a> {
let lhs = word.as_bytes().iter();
let rhs = pattern.as_bytes();
let iter = lhs.zip(rhs);
2022-06-19 13:44:57 +00:00
let mut new_start = 0;
let mut res = true;
for (c_lhs, c_rhs) in iter {
res = res && (c_lhs == c_rhs);
2022-08-11 21:35:40 +00:00
if !res {
break;
}
2022-06-19 13:44:57 +00:00
new_start += 1;
}
2022-08-11 21:35:40 +00:00
return ParseResult {
matched: &word[0..new_start],
residual: &word[new_start..],
};
2022-06-19 13:44:57 +00:00
}
2022-07-14 20:46:11 +00:00
2022-08-11 21:35:40 +00:00
pub(super) fn ident(word_reader: &mut WordReader, keyword: &str) -> Result<(), String> {
2022-07-14 20:46:11 +00:00
// let keyword = "module";
2022-08-11 21:35:40 +00:00
let (word, cursor) = next_word!(word_reader)?;
2022-07-14 20:46:11 +00:00
if word == keyword {
2022-08-11 21:35:40 +00:00
return Ok(());
} else {
2022-07-14 20:46:11 +00:00
let err = format!("found keyword `{word}` but expected `{keyword}` on {cursor:?}");
2022-08-11 21:35:40 +00:00
return Err(err);
2022-07-14 20:46:11 +00:00
}
2022-08-11 21:35:40 +00:00
}