Crates.io | narsese |
lib.rs | narsese |
version | 0.21.3 |
source | src |
created_at | 2024-04-04 18:47:31.865173 |
updated_at | 2024-09-14 02:51:31.982571 |
description | Rust support for Narsese |
homepage | |
repository | https://github.com/ARCJ137442/Narsese.rs |
max_upload_size | |
id | 1196603 |
size | 522,128 |
简体中文 | English |
---|
🕒最后更新时间:【2024-09-14 10:19:55】
Cargo状态:
开发状态:
该项目使用语义化版本 2.0.0进行版本号管理。
Narsese的Rust实现
(最后更新:2024-04-10)
作为已发布于crates.io的Rust库,可直接在Cargo.toml
中添加依赖:
[dependencies.narsese]
version = "0" # 请按需选择合适的最新版本,必要时参考crates.io的对应侧边栏
features = ["bundled"] # 启用所有特性,包括「枚举Narsese」和「词法Narsese」
库特性列表:
bundled
:启用所有特性enum_narsese
:启用「枚举Narsese」lexical_narsese
:启用「词法Narsese」(最后更新:2024-03-29)
use narsese::enum_nse;
fn main() {
// 使用快捷宏解析创建Narsese(需要保证语法正确,否则panic) //
let term = enum_term!(<A --> B>);
let sentence = enum_sentence!("<SELF {-] good>!");
let task = enum_task!($0.8;0.8;0.8$ <robin --> bird>?);
// 输出 / 检验 //
println!("{term:?}");
assert_eq!(term, enum_nse!("<A --> B>").try_into_term().unwrap()); // 字符串形式的解析结果与之相等,并使用`try_into_term`进行向下转换
println!("{sentence:?}");
println!("{task:?}");
}
use narsese::lexical_nse;
fn main() {
// 使用快捷宏解析创建Narsese(需要保证语法正确,否则panic) //
let term = lexical_term!(<A --> B>);
let sentence = lexical_sentence!("<SELF {-] good>!");
let task = lexical_task!($0.8;0.8;0.8$ <robin --> bird>?);
// 输出 / 检验 //
println!("{term:?}");
println!("{sentence:?}");
println!("{task:?}");
}
(更多用例可参考项目的单元测试)
🚧【2024-03-29 00:43:13】WIP:更具体的用例
🚧【2024-04-05 00:09:03】WIP:基础功能
✨基于Rust原生枚举enum
特性实现
✨基于「嵌套字串词法树」实现
(最后更新:2024-04-05)
trait
s,统一表述并定义「具体结构无关」的抽象特征(最后更新:2024-04-05)
可作为CommonNarsese词法解析器(同时用于下游NAVM、BabelNAR)的「标准ASCII词法」
该定义兼容OpenNARS wiki的Narsese语法, 一些不同之处与设计原则在于:
使用如下PEG文法定义:
/// 空白符 | 所有Unicode空白符,解析前忽略
WHITESPACE = _{ WHITE_SPACE }
/// 总入口:词法Narsese | 优先级:任务 > 语句 > 词项
narsese = {
task
| sentence
| term
}
/// 任务:有预算的语句
task = {
budget ~ sentence
}
/// 预算值 | 不包括「空字串」隐含的「空预算」
budget = {
"$" ~ budget_content ~ "$"
}
/// 预算值内容
budget_content = {
(truth_budget_term ~ (";" ~ truth_budget_term)* ~ ";"*)
| "" // 空预算(但带括号)
}
/// 通用于真值、预算值的项 | 用作内部数值,不约束取值范围
truth_budget_term = @{(ASCII_DIGIT|".")+}
/// 语句 = 词项 标点 时间戳? 真值?
sentence = {
term ~ punctuation ~ stamp? ~ truth?
}
/// 词项 = 陈述 | 复合 | 原子
term = {
statement | compound | atom
}
/// 陈述 = <词项 系词 词项>
statement = {
"<" ~ term ~ copula ~ term ~ ">"
}
/// 陈述系词
copula = @{
(punct_sym ~ "-" ~ punct_sym) // 继承/相似/实例/属性/实例属性
| (punct_sym ~ "=" ~ punct_sym) // 蕴含/等价
| ("=" ~ punct_sym ~ ">") // 时序性蕴含
| ("<" ~ punct_sym ~ ">") // 时序性等价
}
/// 标点符号 | 用于「原子词项前缀」「复合词项连接词」和「陈述系词」
punct_sym = { (PUNCTUATION | SYMBOL) }
/// 复合 = (连接词, 词项...) | {外延集...} | [内涵集...]
compound = {
("(" ~ connecter ~ "," ~ term ~ ("," ~ term)* ~ ")") // 基于连接词
| ("{" ~ term ~ ("," ~ term)* ~ "}") // 外延集
| ("[" ~ term ~ ("," ~ term)* ~ "]") // 内涵集
}
/// 复合词项连接词
connecter = @{ punct_sym ~ (!"," ~ punct_sym)* }
/// 原子 = 前缀(可选) 内容
atom = {
"_"+ // 占位符
| (atom_prefix ~ atom_content) // 变量/间隔/操作……
| atom_content // 词语
}
/// 原子词项前缀
atom_prefix = @{ punct_sym+ }
/// 原子词项内容 | 已避免与「复合词项系词」相冲突
atom_content = @{ atom_char ~ (!copula ~ atom_char)* }
/// 能作为「原子词项内容」的字符
atom_char = { LETTER | NUMBER | "_" | "-" }
/// 标点
punctuation = { (PUNCTUATION | SYMBOL) }
/// 时间戳 | 空时间戳会直接在「语句」中缺省
stamp = {
":" ~ (!":" ~ ANY)+ ~ ":"
}
/// 真值 | 空真值会直接在「语句」中缺省
truth = {
"%" ~ (truth_budget_term ~ (";" ~ truth_budget_term)* ~ ";"*) ~ "%"
}
🔗其它另请参考JuNarsese.jl中有关「CommonNarsese」的小节。
该定义可直接通过Rust库pest.rs加载,并已在BabelNAR中用于NARS方言解析
同大多数Rust项目一样,本项目采用 MIT 与 Apache-2.0 双许可发布。