use sipha::prelude::*;
use sipha::types::classes;
use crate::syntax::Kind;
pub fn add_string_lit(g: &mut sipha::builder::GrammarBuilder) {
g.lexer_rule("string_lit", |g| {
g.token(Kind::TokString, |g| {
g.choice(
|g| {
g.byte(b'"');
g.zero_or_more(|g| {
g.neg_lookahead(|g| {
g.byte(b'"');
});
g.choice(
|g| {
g.call("escape");
},
|g| {
g.class(CharClass::ANY);
},
);
});
g.byte(b'"');
},
|g| {
g.byte(b'\'');
g.zero_or_more(|g| {
g.neg_lookahead(|g| {
g.byte(b'\'');
});
g.choice(
|g| {
g.call("escape");
},
|g| {
g.class(CharClass::ANY);
},
);
});
g.byte(b'\'');
},
);
});
});
}
pub fn add_escape(g: &mut sipha::builder::GrammarBuilder) {
g.lexer_rule("escape", |g| {
g.byte(b'\\');
g.choice(
|g| {
g.class(CharClass::from_chars(b"\"'\\nrt"));
},
|g| {
g.byte(b'u');
g.repeat(4.., |g| {
g.class(classes::HEX_DIGIT);
});
},
);
});
}
pub fn add_number_lit(g: &mut sipha::builder::GrammarBuilder) {
g.lexer_rule("number_lit", |g| {
g.token(Kind::TokNumber, |g| {
g.optional(|g| {
g.byte(b'-');
});
g.choice(
|g| {
g.byte(b'0');
},
|g| {
g.byte_range(b'1', b'9');
g.zero_or_more(|g| {
g.class(classes::DIGIT);
});
},
);
g.optional(|g| {
g.byte(b'.');
g.choices(vec![
Box::new(|g| {
g.one_or_more(|g| {
g.class(classes::DIGIT);
});
}),
Box::new(|g| {
g.neg_lookahead(|g| {
g.class(classes::DIGIT);
});
g.neg_lookahead(|g| {
g.byte(b'.');
});
}),
]);
});
});
});
}
pub fn add_number_lit_full(g: &mut sipha::builder::GrammarBuilder) {
g.lexer_rule("number_lit", |g| {
g.token(Kind::TokNumber, |g| {
g.optional(|g| {
g.byte(b'-');
});
g.choice(
|g| {
g.byte(b'0');
},
|g| {
g.byte_range(b'1', b'9');
g.zero_or_more(|g| {
g.class(classes::DIGIT);
});
},
);
g.optional(|g| {
g.byte(b'.');
g.choices(vec![
Box::new(|g| {
g.one_or_more(|g| {
g.class(classes::DIGIT);
});
}),
Box::new(|g| {
g.neg_lookahead(|g| {
g.class(classes::DIGIT);
});
g.neg_lookahead(|g| {
g.byte(b'.');
});
}),
]);
});
g.optional(|g| {
g.choice(
|g| {
g.byte(b'e');
},
|g| {
g.byte(b'E');
},
);
g.optional(|g| {
g.choice(
|g| {
g.byte(b'+');
},
|g| {
g.byte(b'-');
},
);
});
g.one_or_more(|g| {
g.class(classes::DIGIT);
});
});
});
});
}
pub fn add_special_lit(g: &mut sipha::builder::GrammarBuilder) {
g.lexer_rule("special_lit", |g| {
g.choice(
|g| {
g.token(Kind::TokLemnisate, |g| {
g.char('∞');
});
},
|g| {
g.token(Kind::TokPi, |g| {
g.char('π');
});
},
);
});
}