//! 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
}