Fixed cluster eater function to correctly identify and respond to stress

main
Elfein Landers 2022-10-03 10:33:30 -07:00
parent 86f7489403
commit cd29fd4f05
No known key found for this signature in database
GPG Key ID: 703973AA4791AC47
2 changed files with 127 additions and 103 deletions

View File

@ -4,127 +4,139 @@ use super::cluster::{Cluster, ClusterKind};
use crate::lojbanic::Lojbanic;
pub fn eat_cmevla<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
match kind {
ClusterKind::Consonant | ClusterKind::Vowel | ClusterKind::Huhboo | ClusterKind::Glide => {
temp_buf.increase_length(s.len())
}
_ => break,
}
new_offset = i + 1;
}
(temp_buf, &rest[new_offset..])
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
match kind {
ClusterKind::Consonant
| ClusterKind::Vowel
| ClusterKind::Huhboo
| ClusterKind::Glide => temp_buf.increase_length(s.len()),
_ => break,
}
new_offset = i + 1;
}
(temp_buf, &rest[new_offset..])
}
pub fn eat_gismu<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let gismu_offset = 4;
(0..gismu_offset).for_each(|i| temp_buf.increase_length(rest[i].len()));
(temp_buf, &rest[gismu_offset..])
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let gismu_offset = 4;
(0..gismu_offset).for_each(|i| temp_buf.increase_length(rest[i].len()));
(temp_buf, &rest[gismu_offset..])
}
pub fn eat_lujvo<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut stressed = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
match kind {
ClusterKind::Consonant | ClusterKind::Vowel => {
temp_buf.increase_length(s.len());
if s.as_str().chars().any(char::is_lojban_uppercase) {
stressed = true;
new_offset += 1;
continue;
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut stressed = false;
let mut far_stressed = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
match kind {
ClusterKind::Consonant => {
temp_buf.increase_length(s.len());
new_offset += 1;
if s.as_str().chars().any(char::is_lojban_uppercase) {
far_stressed = true;
continue;
}
}
}
ClusterKind::Huhboo | ClusterKind::Glide => temp_buf.increase_length(s.len()),
_ => break,
}
if stressed {
break;
}
new_offset = i + 1;
}
(temp_buf, &rest[new_offset..])
ClusterKind::Vowel => {
temp_buf.increase_length(s.len());
new_offset += 1;
if stressed {
break;
}
if far_stressed {
stressed = true;
}
if s.as_str().chars().any(char::is_lojban_uppercase) {
stressed = true;
continue;
}
}
ClusterKind::Huhboo | ClusterKind::Glide => temp_buf.increase_length(s.len()),
_ => break,
}
new_offset = i + 1;
}
(temp_buf, &rest[new_offset..])
}
pub fn eat_cmavo<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut found_consonant = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
match kind {
ClusterKind::Consonant => {
if found_consonant {
break;
} else {
found_consonant = true;
temp_buf.increase_length(s.len());
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut found_consonant = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
match kind {
ClusterKind::Consonant => {
if found_consonant {
break;
} else {
found_consonant = true;
temp_buf.increase_length(s.len());
}
}
}
ClusterKind::Vowel => {
temp_buf.increase_length(s.len());
found_consonant = true;
}
ClusterKind::Huhboo => temp_buf.increase_length(s.len()),
ClusterKind::Glide => temp_buf.increase_length(s.len()),
_ => break,
}
new_offset = i;
}
(temp_buf, &rest[new_offset + 1..])
ClusterKind::Vowel => {
temp_buf.increase_length(s.len());
found_consonant = true;
}
ClusterKind::Huhboo => temp_buf.increase_length(s.len()),
ClusterKind::Glide => temp_buf.increase_length(s.len()),
_ => break,
}
new_offset = i;
}
(temp_buf, &rest[new_offset + 1..])
}
pub fn eat_number<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut finished = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
new_offset = i;
finished = false;
match kind {
ClusterKind::Number => temp_buf.increase_length(s.len()),
_ => break,
}
finished = true;
}
if finished {
new_offset += 1;
}
(temp_buf, &rest[new_offset..])
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut finished = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
new_offset = i;
finished = false;
match kind {
ClusterKind::Number => temp_buf.increase_length(s.len()),
_ => break,
}
finished = true;
}
if finished {
new_offset += 1;
}
(temp_buf, &rest[new_offset..])
}
pub fn eat_non_lojban<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
new_offset = i + 1;
match kind {
ClusterKind::Whitespace => break,
_ => temp_buf.increase_length(s.len()),
}
}
(temp_buf, &rest[new_offset..])
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
new_offset = i + 1;
match kind {
ClusterKind::Whitespace => break,
_ => temp_buf.increase_length(s.len()),
}
}
(temp_buf, &rest[new_offset..])
}
pub fn eat_whitespace<'a, 'b>(rest: &'b [Cluster<'a>]) -> (StrRange<'a>, &'b [Cluster<'a>]) {
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut finished = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
new_offset = i;
finished = false;
match kind {
ClusterKind::Whitespace => temp_buf.increase_length(s.len()),
_ => break,
}
finished = true;
}
if finished {
new_offset += 1;
}
(temp_buf, &rest[new_offset..])
let mut temp_buf = StrRange::new(rest[0].s.src(), rest[0].s.start(), 0);
let mut new_offset = 0;
let mut finished = false;
for (i, Cluster { s, kind }) in rest.iter().enumerate() {
new_offset = i;
finished = false;
match kind {
ClusterKind::Whitespace => temp_buf.increase_length(s.len()),
_ => break,
}
finished = true;
}
if finished {
new_offset += 1;
}
(temp_buf, &rest[new_offset..])
}

View File

@ -78,8 +78,20 @@ fn lexes() {
Token::cmavo("do")
]
];
assert_eq![
lex("miprAmido"),
[
Token::cmavo("mi"),
Token::brivla("prAmi"),
Token::cmavo("do")
]
];
assert_eq![lex("garbage"), [Token::brivla("garbage")]];
assert_eq![lex("loprami"), [Token::cmavo("lo"), Token::brivla("prami")]];
assert_eq![
lex("mablabigerku"),
[Token::cmavo("ma"), Token::brivla("blabigerku")]
];
assert_eq![
lex("tosmabru"),
[Token::cmavo("to"), Token::brivla("smabru")]