diff options
| author | Laurenz <laurmaedje@gmail.com> | 2019-03-11 22:15:34 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2019-03-11 22:15:34 +0100 |
| commit | 107450ee5ca8e7e0bc03cf6ce9f59268aa20e9f6 (patch) | |
| tree | 4d9df95eb410d7dab96cb7182d6c981ff27f9273 /src/syntax.rs | |
| parent | 0511979942625e0b1aa77f090621e4f35a2cf242 (diff) | |
Restructure typeset crate ✈
Diffstat (limited to 'src/syntax.rs')
| -rw-r--r-- | src/syntax.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/syntax.rs b/src/syntax.rs new file mode 100644 index 00000000..38e5a60e --- /dev/null +++ b/src/syntax.rs @@ -0,0 +1,76 @@ +//! Token and abstract syntax tree representations. + + +/// A logical unit of the incoming text stream. +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum Token<'s> { + /// One or more whitespace (non-newline) codepoints. + Space, + /// A line feed (either `\n` or `\r\n`). + Newline, + /// A left bracket: `[`. + LeftBracket, + /// A right bracket: `]`. + RightBracket, + /// A colon (`:`) indicating the beginning of function arguments. + /// + /// If a colon occurs outside of the function header, it will be + /// tokenized as a [Word](Token::Word). + Colon, + /// Same as with [Colon](Token::Colon). + Equals, + /// Two underscores, indicating text in _italics_. + DoubleUnderscore, + /// Two stars, indicating **bold** text. + DoubleStar, + /// A dollar sign, indicating _mathematical_ content. + Dollar, + /// A hashtag starting a _comment_. + Hashtag, + /// Everything else just is a literal word. + Word(&'s str), +} + +/// A tree representation of the source. +#[derive(Debug, Clone, PartialEq)] +pub struct SyntaxTree<'s> { + /// The children. + pub nodes: Vec<Node<'s>>, +} + +impl<'s> SyntaxTree<'s> { + /// Create an empty syntax tree. + #[inline] + pub fn new() -> SyntaxTree<'s> { + SyntaxTree { nodes: vec![] } + } +} + +/// A node in the abstract syntax tree. +#[derive(Debug, Clone, PartialEq)] +pub enum Node<'s> { + /// Whitespace between other nodes. + Space, + /// A line feed. + Newline, + /// Indicates that italics were enabled/disabled. + ToggleItalics, + /// Indicates that boldface was enabled/disabled. + ToggleBold, + /// Indicates that math mode was enabled/disabled. + ToggleMath, + /// A literal word. + Word(&'s str), + /// A function invocation. + Func(Function<'s>), +} + +/// A node representing a function invocation. +#[derive(Debug, Clone, PartialEq)] +pub struct Function<'s> { + /// The name of the function. + pub name: &'s str, + /// Some syntax tree if the function had a body (second set of brackets), + /// otherwise nothing. + pub body: Option<SyntaxTree<'s>>, +} |
