Skip to content

Commit 07fe348

Browse files
committed
Implement the . expression for the match opcode
1 parent d87c7a9 commit 07fe348

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/translator.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,4 +805,21 @@ mod tests {
805805
assert_eq!(table.translate("afoo"), "⠁⠄⠈⠈");
806806
assert_eq!(table.translate("afoob"), "⠁⠉⠂");
807807
}
808+
809+
#[test]
810+
fn match_with_any_test() {
811+
let rules = vec![
812+
parse_rule("lowercase a 1"),
813+
parse_rule("lowercase b 2"),
814+
parse_rule("lowercase f 3"),
815+
parse_rule("lowercase o 4"),
816+
parse_rule("lowercase r 5"),
817+
parse_rule("match . foo b 14"),
818+
];
819+
let table = TranslationTable::compile(rules, Direction::Forward).unwrap();
820+
assert_eq!(table.translate("foo"), "⠄⠈⠈");
821+
assert_eq!(table.translate("afoo"), "⠁⠄⠈⠈");
822+
assert_eq!(table.translate("afoob"), "⠁⠉⠂");
823+
assert_eq!(table.translate("ffoob"), "⠄⠉⠂");
824+
}
808825
}

src/translator/trie.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ impl TrieNode {
4747
let lowercase = c.to_lowercase().next().unwrap();
4848
self.char_transition(lowercase)
4949
}
50+
fn any_transition(&self) -> Option<&TrieNode> {
51+
self.transitions.get(&Transition::Any)
52+
}
5053
fn word_start_transition(&self) -> Option<&TrieNode> {
5154
self.transitions.get(&Transition::Start(Boundary::Word))
5255
}
@@ -237,15 +240,22 @@ impl Trie {
237240
match_length + 1,
238241
offset,
239242
));
240-
}
241-
if let Some(node) = node.char_case_insensitive_transition(c) {
243+
} else if let Some(node) = node.char_case_insensitive_transition(c) {
242244
matching_rules.extend(self.find_translations_from_node(
243245
&input[bytes..],
244246
Some(c),
245247
node,
246248
match_length + 1,
247249
offset,
248250
));
251+
} else if let Some(node) = node.any_transition() {
252+
matching_rules.extend(self.find_translations_from_node(
253+
&input[bytes..],
254+
Some(c),
255+
node,
256+
match_length + 1,
257+
offset,
258+
));
249259
}
250260
}
251261
if let Some(node) = node.word_start_transition() {

0 commit comments

Comments
 (0)