rust-sen/sehn-serde/src/syntax/mod.rs

116 lines
2.7 KiB
Rust

use std::fmt::{self, Display};
// Shared
pub const COMMA_CHAR: u8 = b',';
// Newline
pub const NEWLINE_LF_CHAR: u8 = b'\n';
pub const NEWLINE_CR_CHAR: u8 = b'\r';
// Whitespace
pub const WHITESPACE_TAB_CHAR: u8 = b'\t';
pub const WHITESPACE_SPACE_CHAR: u8 = b' ';
// Real
pub const REAL_ZERO_CHAR: u8 = b'0';
pub const REAL_NEG_CHAR: u8 = b'-';
pub const REAL_SIGEXP_SEPARATOR_CHAR: u8 = b'e';
// Text
pub const TEXT_CHAR: u8 = b'"';
pub const MULTI_TEXT_CHAR: u8 = b'`';
// Kind
pub const KIND_NS_SEPARATOR_CHAR: u8 = b'/';
// Tag
pub const TAG_START_CHAR: u8 = b'(';
pub const TAG_END_CHAR: u8 = b')';
// Dict
pub const DICT_START_CHAR: u8 = b'{';
pub const DICT_END_CHAR: u8 = b'}';
pub const DICT_KV_SEPARATOR_CHAR: u8 = b':';
pub const DICT_PAIR_SEPARATOR_CHAR: u8 = COMMA_CHAR;
// List
pub const LIST_START_CHAR: u8 = b'[';
pub const LIST_END_CHAR: u8 = b']';
pub const LIST_SEPARATOR_CHAR: u8 = COMMA_CHAR;
// Comment
pub const COMMENT_CHAR: u8 = b'#';
// Boolean
pub const BOOLEAN_TRUE_KEYWORD: &[u8] = b"true";
pub const BOOLEAN_FALSE_KEYWORD: &[u8] = b"false";
#[derive(Clone, Debug, PartialEq)]
pub enum Token {
// Non-value types
Newline,
Whitespace,
Comment,
AlphaLower,
AlphaUpper,
// Kinds
KindNsSep,
// Real
RealMinus,
RealZero,
RealNumeric,
RealSigExpSep,
// Text
TextStart,
TextEnd,
MultiTextStart,
MultiTextEnd,
// Structures
TagStart,
TagEnd,
DictStart,
DictEnd,
DictKvSep,
DictPairSep,
ListStart,
ListEnd,
ListSep
}
impl Token {
pub fn description(&self) -> &'static str {
match self {
Token::Newline => "newline '<lf/<crlf>'",
Token::Whitespace => "whitespace '<tab/space>'",
Token::Comment => "comment '#'",
Token::AlphaLower => "alpha-lower '<a-z>'",
Token::AlphaUpper => "alpha-upper '<A-Z>'",
Token::KindNsSep => "kind ns separator '/'",
Token::RealMinus => "minus '-'",
Token::RealZero => "zero '0'",
Token::RealNumeric => "number '<0-9>'",
Token::RealSigExpSep => "sig-exp separator 'e'",
Token::TextStart => "text '\"'",
Token::TextEnd => "text end '\"'",
Token::MultiTextStart => "multi text '`'",
Token::MultiTextEnd => "multi text end '`'",
Token::TagStart => "tag '('",
Token::TagEnd => "tag end ')'",
Token::DictStart => "dict '{'",
Token::DictEnd => "dict end '}'",
Token::DictKvSep => "dict kv separator ':'",
Token::DictPairSep => "dict pair separator ','",
Token::ListStart => "list '['",
Token::ListEnd => "list end ']'",
Token::ListSep => "list separator ','",
}
}
}
impl Display for Token {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{}", self.description())
}
}