narust-158 0.3.1

A Rust reimplementation of OpenNARS 1.5.8
Documentation
//! NARust方言语法
//! * 🎯更平衡「简单」「易读」「易解析」的特性

/// 空白符 | 所有Unicode空白符,解析前忽略
WHITESPACE = _{ WHITE_SPACE }

// 名称 / 符号 //

/// 括弧
/// * 🚩【2024-05-15 00:05:12】只接受小括号
braces = {
    "("
  | ")" // | "[" | "]" | "{" | "}" | "<" | ">"
}

/// 「名称」
/// * 🎯用于原子词项
name = _{
    name_raw
  | name_normal
}

/// 「名称」常规形式
name_normal = @{ !symbol_esc ~ name_head_char ~ (name_body_char)* }

/// 「名称」头部
name_head_char = { LETTER | NUMBER | "_" }

/// 「名称」主干
/// * 🚩特殊:遇到「括弧」时中断
name_body_char = { name_head_char | "-" }

/// 「名称」纯字串(不包括转义)
name_raw = _{
    name_esc ~ name_raw_value ~ name_esc
}

/// 「名称」纯字符串值
/// * 🎯捕获字符串值,去掉左右转义号
name_raw_value = @{ (!name_esc ~ ANY)+ }

/// 「名称」转义
/// * 🚩单引号
name_esc = _{ "'" }

/// 「符号」
/// * 🎯原子词项前缀、复合词项连接词、陈述系词
symbol = _{
    symbol_raw
  | symbol_normal
}

/// 「符号」常规形式
symbol_normal = @{ !name_esc ~ symbol_head_char ~ (symbol_body_char)* }

/// 「符号」头部
symbol_head_char = { PUNCTUATION | SYMBOL }

/// 「符号」主干
/// * 🚩特殊:遇到「括弧」与「名称头部」时中断
symbol_body_char = { !WHITE_SPACE ~ !braces ~ !name_head_char ~ !name_esc ~ ANY }

/// 「符号」纯字串(不包括转义)
symbol_raw = _{
    symbol_esc ~ symbol_raw_value ~ symbol_esc
}

/// 「符号」纯字符串值
/// * 🎯捕获字符串值,去掉左右转义号
symbol_raw_value = @{ (!symbol_esc ~ ANY)+ }

/// 「符号」转义
/// * 🚩反引号
symbol_esc = _{ "`" }

// 词项:原子+复合 //

/// 总入口/词项:原子+复合
/// * 📌陈述算作是一种「特殊的二元词项」
term = _{
    compound
  | atom
}

/// 原子词项:可选带前缀的「名称」
atom = ${
    // ❌【2024-05-14 23:56:45】不能简并:会遇到`\(a _ b)`问题
    name
  | (symbol ~ name)
}

/// 复合词项:三种形式
/// * 📄一元、二元、多元
compound = _{
    compound_binary
  | compound_unary
  | compound_multi
}

/// 一元复合词项
compound_unary = {
    "(" ~ symbol ~ term ~ ")"
}

/// 二元复合词项
compound_binary = {
    "(" ~ term ~ symbol ~ term ~ ")"
}

/// 多元复合词项
compound_multi = {
    symbol ~ "(" ~ (term)+ ~ ")"
}

// 语句:词项+标点+时间戳+真值 //

/// 「短浮点」
/// * 🎯真值、预算值
/// * 🚩用作内部数值,不约束取值范围
short_float = @{ (ASCII_DIGIT | ".")+ }

/// 总入口/语句:「词项」+「标点」+「时间戳」+「真值」
/// * 📌「时间戳」和「真值」是可选的
sentence = {
    term ~ punctuation ~ stamp? ~ truth?
}

/// 标点
punctuation = @{ symbol }

/// 时间戳 | 空时间戳会直接在「语句」中缺省
stamp = @{
    ":" ~ (!":" ~ ANY)+ ~ ":"
}

/// 真值 | 空真值会直接在「语句」中缺省
truth = {
    "%" ~ (short_float ~ (";" ~ short_float)* ~ ";"*) ~ "%"
}

// 任务:预算值+语句 //

/// 任务:有预算的语句
task = {
    budget ~ sentence
}

/// 预算值 | 不包括「空字串」隐含的「空预算」
budget = {
    // 可空
    "$" ~ (short_float ~ (";" ~ short_float)* ~ ";"*)? ~ "$"
}

// Narsese:词项|语句|任务 //
narsese = _{
    task
  | sentence
  | term
}