fnotation 0.11.2

A simple lower-house syntax for programming language experimentation
Documentation
use std::fmt;
use tattle::Loc;

#[allow(non_camel_case_types)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Kind {
    ERROR,
    EOF,
    BOF,
    ANNOT,

    VAR,
    KEYWORD,
    TOPDECL,
    PRIM,
    SPECIAL,
    FIELD,
    OP,
    KEYWORD_OP,
    TAG,

    INT,
    FLOAT,
    STRING,

    LPAREN,
    RPAREN,
    LCURLY,
    RCURLY,
    LBRACK,
    RBRACK,
    COMMA,
    SEMICOLON,
}

pub use Kind::*;

#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct Token {
    pub preceding_whitespace: bool,
    pub kind: Kind,
    pub loc: Loc,
}

impl Token {
    pub fn new(preceding_whitespace: bool, kind: Kind, loc: Loc) -> Self {
        Self {
            preceding_whitespace,
            kind,
            loc,
        }
    }
}

impl fmt::Display for Token {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{:?}:{}-{}", self.kind, self.loc.start, self.loc.end)
    }
}