#english #linguistics #algorithm #sound #mark #change #soundchange

soundchange-english

重新实现Mark Rosenfelder的英语发音算法

7个版本

使用旧的Rust 2015

0.0.8 2015年3月3日
0.0.7 2015年2月21日
0.0.5 2015年1月7日
0.0.1 2014年12月9日

#21 in #linguistics

21 每月下载量

MIT 许可证

40KB
799

Rust-soundchange

实现语音变化算法的工具。

这是严格模仿Mark Rosenfelder的Sound Change Applier,并针对Rust的宏系统进行了必要的调整。

典型用法和与原始SCA规则的比较

#[macro_use] extern crate soundchange;
#[macro_use] extern crate log;

use soundchange::{CharOf, StrTo};

fn main() {
    // custom conditions
    let is_boundary = |c: Option<char>| c.is_none();
    let is_vowel = |c: Option<char>| c.map_or(false, |c| "aeiou".contains_char(c));
    let boundary = CharOf(&is_boundary);
    let vowel = CharOf(&is_vowel);

    // custom transformers
    let make_reverse = |s: &str, out: &mut String| out.extend(s.chars().rev());
    let reverse = StrTo(&make_reverse);

    let s = "fihs".to_string();
    let s = subst_rules! { s =>                 // V=aeiou
        "f" [boundary] => "gh";                 // f/gh/_#
        "f" => "ph";                            // f/ph/_
        ["w"] vowel ["m" vowel "n"] => "o";     // V/o/w_mVn
        "sh" ["o"] => "ti";                     // sh/ti/_o
        [vowel] "hs" => reverse;                // sh/\\/V_
        "" [boundary] => "ing";                 // /ing/_#
    };
    assert_eq!(s, "phishing");
}

注意:您可以使用RUST_LOG=4来跟踪字符串和触发该变化的规则上的任何变化。另外,大量规则可能会触发rustc的递归限制;在这种情况下,您必须将它们分割。

左侧的任何表达式都被认为是“搜索条件”,可以是char&str或从Option<char>bool的函数。函数参数是Option,因为它可以查看字符串边界。[]表示上下文,在字符串转换时不会被考虑。(条件的行为也可以通过实现IntoCond特性和/或Search特性来自定义。&str和函数都实现了这两个特性。)

右侧的任何表达式都被认为是“转换器”,可以是char&str或从charchar的函数。当匹配多个字符时,将针对每个字符调用一个函数。(转换器的行为也可以通过实现Transform特性来自定义。)

实际的转换是通过subst函数驱动的,该函数方便地被包装在subst_rules!宏中。除了它返回一个CowString之外,语法应该是自我解释的。

案例研究:英语发音

src/english 提供了 Mark Rosenfelder 的 英语发音算法 的重实现。

依赖项

~165KB