116 lines
2.7 KiB
Rust
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())
|
|
}
|
|
}
|