ergoscript_compiler/
syntax.rs

1// Initial version is copied from https://github.com/arzg/eldiro
2// Checkout https://arzg.github.io/lang/ for description
3use super::lexer::TokenKind;
4use num_derive::{FromPrimitive, ToPrimitive};
5use num_traits::{FromPrimitive, ToPrimitive};
6
7#[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)]
8pub enum SyntaxKind {
9    Whitespace,
10    FnKw,
11    ValKw,
12    Ident,
13    IntNumber,
14    LongNumber,
15    Plus,
16    Minus,
17    Star,
18    Slash,
19    And,
20    Equals,
21    LParen,
22    RParen,
23    LBrace,
24    RBrace,
25    Comment,
26    Error,
27    Root,
28    InfixExpr,
29    ParenExpr,
30    PrefixExpr,
31    VariableDef,
32}
33
34impl From<TokenKind> for SyntaxKind {
35    fn from(token_kind: TokenKind) -> Self {
36        match token_kind {
37            TokenKind::Whitespace => Self::Whitespace,
38            TokenKind::FnKw => Self::FnKw,
39            TokenKind::ValKw => Self::ValKw,
40            TokenKind::Ident => Self::Ident,
41            TokenKind::IntNumber => Self::IntNumber,
42            TokenKind::LongNumber => Self::LongNumber,
43            TokenKind::Plus => Self::Plus,
44            TokenKind::Minus => Self::Minus,
45            TokenKind::Star => Self::Star,
46            TokenKind::Slash => Self::Slash,
47            TokenKind::Equals => Self::Equals,
48            TokenKind::LParen => Self::LParen,
49            TokenKind::RParen => Self::RParen,
50            TokenKind::LBrace => Self::LBrace,
51            TokenKind::RBrace => Self::RBrace,
52            TokenKind::Comment => Self::Comment,
53            TokenKind::Error => Self::Error,
54            TokenKind::And => Self::And,
55        }
56    }
57}
58
59pub type SyntaxNode = rowan::SyntaxNode<ErgoScriptLanguage>;
60pub type SyntaxElement = rowan::SyntaxElement<ErgoScriptLanguage>;
61pub type SyntaxToken = rowan::SyntaxToken<ErgoScriptLanguage>;
62
63#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
64pub enum ErgoScriptLanguage {}
65
66impl rowan::Language for ErgoScriptLanguage {
67    type Kind = SyntaxKind;
68
69    fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
70        Self::Kind::from_u16(raw.0).unwrap()
71    }
72
73    fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
74        rowan::SyntaxKind(kind.to_u16().unwrap())
75    }
76}