Fixed cluster eater function to correctly identify and respond to stress
parent
86f7489403
commit
cd29fd4f05
218
src/lex/eat.rs
218
src/lex/eat.rs
|
@ -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..])
|
||||
}
|
||||
|
|
12
src/lib.rs
12
src/lib.rs
|
@ -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")]
|
||||
|
|
Loading…
Reference in New Issue