Skip to content

Commit

Permalink
feat: ✨ 引入anyhow,首个命令行CIN启动器示例,拟引用pest做方言解析
Browse files Browse the repository at this point in the history
1. 引入`anyhow`包,规范错误类型并弃用`util::ResultS`
2. 测试用「CIN启动器」:首个交互式终端跑通(🚧后续添加「CIN选择」与「自动CIN路径查找」)
3. 为各个CIN实现设置独立的feature,并对OpenNARS、ONA引入`pest`库(🚧后续做方言解析)
  • Loading branch information
ARCJ137442 committed Mar 27, 2024
1 parent 176b452 commit 40f8432
Show file tree
Hide file tree
Showing 20 changed files with 511 additions and 121 deletions.
7 changes: 6 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
"openjunars",
"rfind",
"runpy",
"thiserror",
"traceback",
"tstate"
]
],
"rust-analyzer.linkedProjects": [
".\\Cargo.toml",
// ".\\Cargo.toml"
],
}
83 changes: 82 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 46 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,28 @@
[package]
name = "babel_nar"
version = "0.7.0"
version = "0.8.0"
edition = "2021"

[dependencies]

[dependencies.anyhow]
version = "1.0.81"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
regex = "1.10.4"
# Rust版本的正则表达式
# * 🎯用于解析提取NARS输出
# * 📄OpenNARS、ONA、PyNARS
[dependencies.regex]
version = "1.10.4"
optional = true

# Rust版本的PEG解析器
# * 🎯用于对接一些NARS方言的解析
# * 📄OpenNARS(操作语法)、ONA(中缀语法)
[dependencies.pest]
version = "2.7.8"
optional = true

# 用于实现「静态含闭包常量」
# * 🎯初次引入:NARS-Python 方言格式
Expand Down Expand Up @@ -47,7 +63,7 @@ default = []
# 大杂烩
bundled = [
"cin_implements",
"lazy_static" # 这个「词法Narsese」也在用
"lazy_static", # 这个「词法Narsese」也在用
]
# 各个独立的特性 #
# 具体接口实现:
Expand All @@ -56,4 +72,29 @@ bundled = [
# ✅PyNARS
# ✅NARS-Python(不稳定)
# ✅OpenJunars(不稳定)
cin_implements = []
cin_implements = [
"opennars",
"ona",
"pynars",
"nars_python",
"openjunars",
]
# ✅OpenNARS接口
opennars = [
"regex",
"pest",
]
# ✅ONA接口
ona = [
"regex",
"pest",
]
# ✅PyNARS接口
pynars = [
"regex",
# "pest", # ! 【2024-03-27 20:52:17】无需特别解析方言:其输出即为CommonNarsese
]
# ✅NARS-Python接口(不稳定)
nars_python = []
# ✅OpenJunars接口(不稳定)
openjunars = []
68 changes: 67 additions & 1 deletion src/bin/cin_launcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,73 @@
//! * ✨自动查找(可能)可用的CIN可执行文件(文件搜索)
//! * ✨自动启动并管理CIN
//! TODO: 完成代码
#![allow(unused)]

use babel_nar::{ona::ONA, opennars::OpenNARS, runtime::CommandVmRuntime};
use navm::{
cmd::Cmd,
output::Output,
vm::{VmLauncher, VmRuntime},
};
use std::{fmt::Debug, io::stdin};

const TEST_PATH_OPENNARS: &str = r"..\..\NARS-executables\opennars-304-T-modified.jar";
const TEST_PATH_ONA: &str = r"..\..\NARS-executables\NAR.exe";

/// 启动NARS
/// * 🚩【2024-03-27 18:55:07】目前就返回一个测试用的运行时
fn get_nars() -> impl VmLauncher<CommandVmRuntime> {
OpenNARS::new(TEST_PATH_OPENNARS)
// ONA::new(TEST_PATH_ONA)
}

/// 主函数
/// TODO: 完成代码
fn main() {}
fn main() {
// 不断开始🔥
loop {
start();
}
}

/// 开始
fn start() {
let nars = get_nars().launch();
shell(nars);
}

/// 打印错误
fn println_error(e: &impl Debug) {
println!("{e:?}");
}

/// 交互式命令行
fn shell(mut nars: CommandVmRuntime) {
let stdin = stdin();
let mut input = String::new();
let mut line;
'main: while stdin.read_line(&mut input).is_ok() {
// 一行
line = input.as_str();

// 非空⇒解析出NAVM指令,作为输入执行
if !line.trim().is_empty() {
if let Ok(cmd) = Cmd::parse(line).inspect_err(println_error) {
let _ = nars.input_cmd(cmd).inspect_err(println_error);
}
}

// 尝试拉取所有NAVM运行时输出
while let Ok(Some(output)) = nars.try_fetch_output().inspect_err(println_error) {
println!("{output:?}");
if let Output::TERMINATED { .. } = output {
println!("NAVM已终止运行,正在重启。。。");
nars.terminate();
break 'main; // ! 这个告诉Rust编译器,循环必将在此结束
}
}

// 清空缓冲区
input.clear();
}
}
3 changes: 3 additions & 0 deletions src/cin_implements/common/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
//! 所有对接CIN实现的共用模块
// 平铺导出元素
util::pub_mod_and_pub_use! {
java
python
Expand Down
11 changes: 10 additions & 1 deletion src/cin_implements/nars_python/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,16 @@ mod tests {
}

/// 测试/NARS-Python
/// * ❌【2024-03-26 01:42:14】目前还没法真正截取到输出
/// 【2024-03-27 18:29:42】最近一次输出(NARS-Python控制台):
///
/// ```text
/// IN: SentenceID:0:ID (A --> B). %1.00;0.90%
/// IN: SentenceID:1:ID (B --> C). %1.00;0.90%
/// IN: SentenceID:2:ID (A --> C)?
/// OUT: SentenceID:3:ID (A --> C). %1.00;0.81%
/// ```
///
/// ! ❌仍然无法截获其输出
pub(crate) fn _test_nars_python(mut vm: CommandVmRuntime) {
// 等待几秒钟,让exe的界面显示出来
std::thread::sleep(std::time::Duration::from_secs(2));
Expand Down
13 changes: 7 additions & 6 deletions src/cin_implements/nars_python/translators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@
//! * `PREMISE IS TRUE: ((*,{SELF}) --> ^right)`
//! * `PREMISE IS SIMPLIFIED ({SELF} --> [SAFE]) FROM (&|,({SELF} --> [SAFE]),((*,{SELF}) --> ^right))`
use super::format_in_nars_python;
use crate::runtime::TranslateError;
use anyhow::Result;
use narsese::lexical::Narsese;
use navm::{
cmd::Cmd,
output::{Operation, Output},
};
use util::ResultS;

use super::format_in_nars_python;

/// NARS-Python的「输入转译」函数
/// * 🎯用于将统一的「NAVM指令」转译为「NARS-Python输入」
pub fn input_translate(cmd: Cmd) -> ResultS<String> {
pub fn input_translate(cmd: Cmd) -> Result<String> {
let content = match cmd {
// 使用「末尾」将自动格式化任务(可兼容「空预算」的形式)
// * ✅【2024-03-26 01:44:49】目前采用特定的「方言格式」解决格式化问题
Expand All @@ -31,7 +31,8 @@ pub fn input_translate(cmd: Cmd) -> ResultS<String> {
// ! NARS-Python Shell同样是自动步进的
Cmd::CYC(n) => n.to_string(),
// 其它类型
_ => return Err(format!("该指令类型暂不支持:{cmd:?}")),
// ! 🚩【2024-03-27 22:42:56】不使用[`anyhow!`]:打印时会带上一大堆调用堆栈
_ => return Err(TranslateError(format!("该指令类型暂不支持:{cmd:?}")).into()),
};
// 转译
Ok(content)
Expand All @@ -40,7 +41,7 @@ pub fn input_translate(cmd: Cmd) -> ResultS<String> {
/// NARS-Python的「输出转译」函数
/// * 🎯用于将NARS-Python Shell的输出(字符串)转译为「NAVM输出」
/// * 🚩直接根据选取的「头部」进行匹配
pub fn output_translate(content: String) -> ResultS<Output> {
pub fn output_translate(content: String) -> Result<Output> {
// 根据冒号分隔一次,然后得到「头部」
let head = content.split_once(':').unwrap_or(("", "")).0.to_lowercase();
// 根据「头部」生成输出
Expand Down
24 changes: 24 additions & 0 deletions src/cin_implements/ona/dialect.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//! ONA方言
//! * 🎯解析ONA输出,如
//! * 📄以空格分隔的词项:`(* {SELF})`
//! * 📄`({SELF} * x)`
//!
//! TODO: 完成语法解析
use narsese::conversion::string::impl_lexical::{
format_instances::FORMAT_ASCII, structs::ParseResult,
};

/// 使用[`pest`]将输入的「ONA方言」转换为「词法Narsese」
/// 以ONA的语法解析出Narsese
/// * 🚩【2024-03-25 21:08:34】目前是直接调用ASCII解析器
///
/// TODO: 兼容ONA的方言语法
/// * 📌重点在「用空格分隔乘积词项/中缀情形」的语法
/// * 📄`(* {SELF})`
/// * 📄`({SELF} * x)`
pub fn parse(input: &str) -> ParseResult {
FORMAT_ASCII.parse(input)
// #![allow(unused)]
// todo!("ONA方言!")
}
17 changes: 17 additions & 0 deletions src/cin_implements/ona/dialect_ona.pest
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// TODO: 有待替换
num = @{ int ~ ("." ~ ASCII_DIGIT*)? ~ (^"e" ~ int)? }
int = { ("+" | "-")? ~ ASCII_DIGIT+ }

operation = _{ add | subtract | multiply | divide | power }
add = { "+" }
subtract = { "-" }
multiply = { "*" }
divide = { "/" }
power = { "^" }

expr = { term ~ (operation ~ term)* }
term = _{ num | "(" ~ expr ~ ")" }

calculation = _{ SOI ~ expr ~ EOI }

WHITESPACE = _{ " " | "\t" }
2 changes: 2 additions & 0 deletions src/cin_implements/ona/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ util::mod_and_pub_use! {
translators
// 启动器
launcher
// 方言 | 【2024-03-27 18:42:50】使用`pest`库解析特殊语法
dialect
}

/// 单元测试
Expand Down
Loading

0 comments on commit 40f8432

Please sign in to comment.