1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//! Parser and loader for `.llev` rule files.
//!
//! This module provides support for loading custom phonetic rewrite rules from
//! `.llev` (or `.llv`) files. The file format is human-readable and supports:
//!
//! - File metadata (`@name`, `@version`, `@author`, `@description`)
//! - Symbol definitions (`@define`) for reusable patterns
//! - Include directives (`@include`) for modular rule organization
//! - Rule definitions with optional metadata (id, name, weight, group, enabled)
//! - Comments (line `#`, `//` and block `/* */`)
//!
//! # Example `.llev` File
//!
//! ```text
//! # English Phonetic Spelling Rules
//! @name "English Phonetic Rules"
//! @version "1.0"
//!
//! # Define reusable character classes
//! @define FRONT_VOWEL = [ei]
//!
//! # ============================================================
//! # Orthography Rules
//! # ============================================================
//!
//! [id: 1, name: "ph to f"]
//! ph -> f; # phone -> fone
//!
//! [id: 20, name: "soft c", weight: 0.0]
//! c -> s / _FRONT_VOWEL; # city -> sity
//!
//! [id: 21, name: "hard c"]
//! c -> k; # cat -> kat
//!
//! [id: 33, name: "silent final e"]
//! e -> / _#; # make -> mak
//!
//! /* Silent gh - can be silent (night) or /f/ (enough)
//! For simplicity, delete everywhere */
//! [id: 34, name: "silent gh"]
//! gh -> ;
//!
//! # Include additional rules
//! @include "additional_rules.llv"
//! ```
//!
//! # Usage
//!
//! ```rust,ignore
//! use liblevenshtein::phonetic::llev::{RuleSet, parse_file};
//!
//! // Load rules from a file
//! let rules = parse_file("english.llev")?;
//!
//! // Use with existing phonetic functions
//! use liblevenshtein::phonetic::apply_rules_seq;
//! let result = apply_rules_seq(&rules.rules, "phone");
//!
//! // Or compile to NFA
//! use liblevenshtein::phonetic::rules_to_nfa;
//! let nfa = rules_to_nfa(&rules.rules);
//! ```
//!
//! # AOT Compilation
//!
//! Rules can be compiled to binary format for faster loading:
//!
//! ```bash
//! # Compile to binary
//! liblevenshtein -c english.llev -o english.llev.bin
//!
//! # Load compiled rules (faster startup)
//! let rules = RuleSet::from_compiled("english.llev.bin")?;
//! ```
//!
//! # File Format Grammar
//!
//! See [`ast`] module documentation for the complete eBNF grammar.
// Re-export main types
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
// Re-export compiled module functions (requires serialization feature)
pub use ;