1use crate::ast::{Expr, Statement};
2use crate::error::Result;
3use crate::parser::Parser;
4use crate::parser::precedence::Precedence;
5
6pub trait Dialect: std::fmt::Debug {
8 fn is_identifier_start(&self, ch: char) -> bool;
10
11 fn is_identifier_part(&self, ch: char) -> bool;
13
14 fn parse_statement(&self, parser: &mut Parser<'_>) -> Option<Result<Statement>>;
16
17 fn parse_prefix(&self, parser: &mut Parser<'_>) -> Option<Result<Expr>>;
19
20 fn prec_value(&self, prec: Precedence) -> u8;
22}
23
24#[derive(Debug, Default, Clone)]
26pub struct AlopexDialect;
27
28impl Dialect for AlopexDialect {
29 fn is_identifier_start(&self, ch: char) -> bool {
30 ch == '_' || ch.is_ascii_alphabetic()
31 }
32
33 fn is_identifier_part(&self, ch: char) -> bool {
34 ch == '_' || ch.is_ascii_alphanumeric()
35 }
36
37 fn parse_statement(&self, _parser: &mut Parser<'_>) -> Option<Result<Statement>> {
38 None
39 }
40
41 fn parse_prefix(&self, parser: &mut Parser<'_>) -> Option<Result<Expr>> {
42 if matches!(
43 parser.peek().token,
44 crate::tokenizer::token::Token::LBracket
45 ) {
46 return Some(parser.parse_vector_literal());
47 }
48 None
49 }
50
51 fn prec_value(&self, prec: Precedence) -> u8 {
52 prec.value()
53 }
54}