lang: start working on parser that parses to events

This commit is contained in:
Schrottkatze 2024-04-12 15:43:34 +02:00
parent 2d59a7f560
commit f7b61f9e0e
Signed by: schrottkatze
SSH key fingerprint: SHA256:hXb3t1vINBFCiDCmhRABHX5ocdbLiKyCdKI4HK2Rbbc
2 changed files with 36 additions and 13 deletions

View file

@ -11,20 +11,37 @@ use crate::parser::{
use super::lex::{self, SyntaxKind};
mod parsers {
use rowan::GreenNode;
pub mod parser_to_events {
use chumsky::Parser;
use crate::parser::ast::lossless::lex::SyntaxKind;
use crate::parser::ast::lossless::lex::SyntaxKind::{self, *};
use super::SyntaxError;
struct ParseResult {
green_node: GreenNode,
errors: Vec<SyntaxError>,
#[derive(Debug, PartialEq, Eq)]
pub(super) enum Event {
StartNode,
StartErr(SyntaxError),
EatToken,
FinishNode,
FinishErr,
}
trait Parser {
fn parse<'src>(input: &[(SyntaxKind, &'src str)]) -> ParseResult;
#[derive(Debug, PartialEq, Eq)]
enum SyntaxError {
Expected(SyntaxKind),
AttrExpectedValue,
/// guessed if there's a newline and attr on next line without comma
/// should then suggest comma after attr
ExpectedCommaBetweenAttrs,
}
pub fn to_events(src: &str) -> Vec<Event> {
let mut tokens = lex::lex(src);
parser().parse(tokens)
}
pub fn parser() -> impl Parser<'static, SyntaxKind, Vec<Event>> {
let whitespace = just(WHITESPACE).or(NEWLINE).repeated().collect::<Vec<_>>();
whitespace
}
}