lang: parse pipelines

This commit is contained in:
Schrottkatze 2024-05-04 21:44:02 +02:00
parent 30f17773a8
commit afd493be16
Signed by: schrottkatze
SSH key fingerprint: SHA256:hXb3t1vINBFCiDCmhRABHX5ocdbLiKyCdKI4HK2Rbbc
3 changed files with 48 additions and 38 deletions

View file

@ -5,44 +5,7 @@ use self::{collection::collection, instruction::instr, lit::literal, pipeline::P
mod collection; mod collection;
mod instruction; mod instruction;
mod lit; mod lit;
mod pipeline { mod pipeline;
use enumset::enum_set;
use crate::lst_parser::{
error::SyntaxError,
syntax_kind::{SyntaxKind::*, TokenSet},
CompletedMarker, Parser,
};
use super::expression;
pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option<CompletedMarker> {
if !pipe(p) {
return Some(start_expr);
}
let pipeline_marker = start_expr.precede(p, "pipeline_start");
loop {
if expression(p, true).is_none() {
return Some(pipeline_marker.complete_err(p, SyntaxError::PipelineNeedsSink));
}
if !pipe(p) {
return Some(pipeline_marker.complete(p, PIPELINE));
}
}
}
pub const PIPES: TokenSet = enum_set!(PIPE | MAPPING_PIPE | NULL_PIPE);
fn pipe(p: &mut Parser) -> bool {
if PIPES.contains(p.current()) {
p.do_bump();
true
} else {
false
}
}
}
pub fn expression(p: &mut Parser, in_pipe: bool) -> Option<CompletedMarker> { pub fn expression(p: &mut Parser, in_pipe: bool) -> Option<CompletedMarker> {
let expr = p.start("expr"); let expr = p.start("expr");

View file

@ -0,0 +1,36 @@
use enumset::enum_set;
use crate::lst_parser::{
error::SyntaxError,
syntax_kind::{SyntaxKind::*, TokenSet},
CompletedMarker, Parser,
};
use super::expression;
pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option<CompletedMarker> {
if !pipe(p) {
return Some(start_expr);
}
let pipeline_marker = start_expr.precede(p, "pipeline_start");
loop {
if expression(p, true).is_none() {
return Some(pipeline_marker.complete_err(p, SyntaxError::PipelineNeedsSink));
}
if !pipe(p) {
return Some(pipeline_marker.complete(p, PIPELINE));
}
}
}
pub const PIPES: TokenSet = enum_set!(PIPE | MAPPING_PIPE | NULL_PIPE);
fn pipe(p: &mut Parser) -> bool {
if PIPES.contains(p.current()) {
p.do_bump();
true
} else {
false
}
}

View file

@ -19,10 +19,21 @@ pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> {
pub enum SyntaxKind { pub enum SyntaxKind {
#[token("def")] #[token("def")]
DEF_KW = 0, DEF_KW = 0,
DEF,
DEF_NAME,
DEF_BODY,
#[token("let")] #[token("let")]
LET_KW, LET_KW,
#[token("in")] #[token("in")]
IN_KW, IN_KW,
LET_IN,
#[token("mod")]
MOD_KW,
MODULE,
MODULE_BODY,
#[token("use")]
USE_KW,
USE_PAT,
#[regex("[\\d]+")] #[regex("[\\d]+")]
INT_NUM, INT_NUM,
#[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)")] #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)")]