142 lines
2.9 KiB
Rust
142 lines
2.9 KiB
Rust
/// Source location
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub struct Span {
|
|
pub line: u32,
|
|
pub col: u32,
|
|
}
|
|
|
|
impl Span {
|
|
pub fn new(line: u32, col: u32) -> Self {
|
|
Self { line, col }
|
|
}
|
|
}
|
|
|
|
/// Token with source location
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
pub struct Token {
|
|
pub kind: TokenKind,
|
|
pub span: Span,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
pub enum TokenKind {
|
|
// Header keywords
|
|
Name,
|
|
Category,
|
|
Inputs,
|
|
Outputs,
|
|
Params,
|
|
State,
|
|
Ui,
|
|
Process,
|
|
|
|
// Type keywords
|
|
Audio,
|
|
Cv,
|
|
Midi,
|
|
F32,
|
|
Int,
|
|
Bool,
|
|
Sample,
|
|
|
|
// Category values
|
|
Generator,
|
|
Effect,
|
|
Utility,
|
|
|
|
// Statement keywords
|
|
Let,
|
|
Mut,
|
|
If,
|
|
Else,
|
|
For,
|
|
In,
|
|
|
|
// UI keywords
|
|
Group,
|
|
Param,
|
|
Canvas,
|
|
Spacer,
|
|
|
|
// Literals
|
|
FloatLit(f32),
|
|
IntLit(i32),
|
|
StringLit(String),
|
|
True,
|
|
False,
|
|
|
|
// Identifiers
|
|
Ident(String),
|
|
|
|
// Operators
|
|
Plus,
|
|
Minus,
|
|
Star,
|
|
Slash,
|
|
Percent,
|
|
Eq, // =
|
|
EqEq, // ==
|
|
BangEq, // !=
|
|
Lt, // <
|
|
Gt, // >
|
|
LtEq, // <=
|
|
GtEq, // >=
|
|
AmpAmp, // &&
|
|
PipePipe, // ||
|
|
Bang, // !
|
|
|
|
// Delimiters
|
|
LBrace, // {
|
|
RBrace, // }
|
|
LBracket, // [
|
|
RBracket, // ]
|
|
LParen, // (
|
|
RParen, // )
|
|
Colon, // :
|
|
Comma, // ,
|
|
Semicolon, // ;
|
|
DotDot, // ..
|
|
|
|
// End of file
|
|
Eof,
|
|
}
|
|
|
|
impl TokenKind {
|
|
/// Try to match an identifier string to a keyword
|
|
pub fn from_ident(s: &str) -> TokenKind {
|
|
match s {
|
|
"name" => TokenKind::Name,
|
|
"category" => TokenKind::Category,
|
|
"inputs" => TokenKind::Inputs,
|
|
"outputs" => TokenKind::Outputs,
|
|
"params" => TokenKind::Params,
|
|
"state" => TokenKind::State,
|
|
"ui" => TokenKind::Ui,
|
|
"process" => TokenKind::Process,
|
|
"audio" => TokenKind::Audio,
|
|
"cv" => TokenKind::Cv,
|
|
"midi" => TokenKind::Midi,
|
|
"f32" => TokenKind::F32,
|
|
"int" => TokenKind::Int,
|
|
"bool" => TokenKind::Bool,
|
|
"sample" => TokenKind::Sample,
|
|
"generator" => TokenKind::Generator,
|
|
"effect" => TokenKind::Effect,
|
|
"utility" => TokenKind::Utility,
|
|
"let" => TokenKind::Let,
|
|
"mut" => TokenKind::Mut,
|
|
"if" => TokenKind::If,
|
|
"else" => TokenKind::Else,
|
|
"for" => TokenKind::For,
|
|
"in" => TokenKind::In,
|
|
"group" => TokenKind::Group,
|
|
"param" => TokenKind::Param,
|
|
"canvas" => TokenKind::Canvas,
|
|
"spacer" => TokenKind::Spacer,
|
|
"true" => TokenKind::True,
|
|
"false" => TokenKind::False,
|
|
_ => TokenKind::Ident(s.to_string()),
|
|
}
|
|
}
|
|
}
|