ergoscript_compiler/
syntax.rs1use 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}