From 0d5e533627dac4e81cd4dda91f141f5ed0db8b78 Mon Sep 17 00:00:00 2001 From: Federico Lolli <federico.lolli@skywarder.eu> Date: Fri, 15 Mar 2024 01:41:42 +0100 Subject: [PATCH] Added WIP arpist-traject --- on-host/arpist-traject/Cargo.toml | 7 +++ on-host/arpist-traject/grammar.txt | 26 ++++++++++ on-host/arpist-traject/src/main.rs | 15 ++++++ on-host/arpist-traject/src/tokens.rs | 73 ++++++++++++++++++++++++++++ on-host/arpist-traject/test.txt | 8 +++ 5 files changed, 129 insertions(+) create mode 100644 on-host/arpist-traject/Cargo.toml create mode 100644 on-host/arpist-traject/grammar.txt create mode 100644 on-host/arpist-traject/src/main.rs create mode 100644 on-host/arpist-traject/src/tokens.rs create mode 100644 on-host/arpist-traject/test.txt diff --git a/on-host/arpist-traject/Cargo.toml b/on-host/arpist-traject/Cargo.toml new file mode 100644 index 0000000..3771453 --- /dev/null +++ b/on-host/arpist-traject/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "arpist-traject" +version = "0.1.0" +edition = "2021" + +[dependencies] +logos = "0.14.0" diff --git a/on-host/arpist-traject/grammar.txt b/on-host/arpist-traject/grammar.txt new file mode 100644 index 0000000..99bd024 --- /dev/null +++ b/on-host/arpist-traject/grammar.txt @@ -0,0 +1,26 @@ +TRAJECTORY <- TIME_DEF (FILLER* GENERATOR PARAMETER+ FILLER* TIME_DEF)+ + +TIME_DEF <- "@" SPACE+ "T" POS_NUM SPACE* NEWLINE +GENERATOR <- "=" SPACE+ "[" GENERATOR_KIND "]" SPACE* NEWLINE +PARAMETER <- "#" SPACE+ COORDINATE SPACE* ":" SPACE* EQUATION SPACE* NEWLINE +FILLER <- "|" SPACE* NEWLINE + +GENERATOR_KIND <- "parametric" +COORDINATE <- [xyz] + +EXPR <- SUM +SUM <- PRODUCT (SPACE* (SUM_OP / SUB_OP) SPACE* PRODUCT)* +PRODUCT <- POWER (SPACE* (PRODUCT_OP / DIV_OP) SPACE* POWER)* +POWER <- VALUE (SPACE* POWER_OP SPACE* VALUE)* +VALUE <- NUM / "(" EXPR ")" +NUM <- POS_NUM / NEG_NUM +NEG_NUM <- "-" NUM +POS_NUM <- ("+")? [0-9]+ ("." [0-9]+)? + +SUM_OP <- "+" +SUB_OP <- "-" +PRODUCT_OP <- "*" +POWER_OP <- "^" +DIV_OP <- "/" +NEWLINE <- [\n\r] +SPACE <- [ \t] diff --git a/on-host/arpist-traject/src/main.rs b/on-host/arpist-traject/src/main.rs new file mode 100644 index 0000000..9818c45 --- /dev/null +++ b/on-host/arpist-traject/src/main.rs @@ -0,0 +1,15 @@ +mod tokens; + +use logos::Logos; + +use self::tokens::Token; + +fn main() { + let input = std::fs::read_to_string("test.txt").unwrap(); + let lex = Token::lexer(&input); + let tokens = lex.spanned().collect::<Vec<_>>(); + for token in &tokens { + println!("{:?}", token.0.as_ref().unwrap()); + } + // dbg!(tokens); +} diff --git a/on-host/arpist-traject/src/tokens.rs b/on-host/arpist-traject/src/tokens.rs new file mode 100644 index 0000000..2654f31 --- /dev/null +++ b/on-host/arpist-traject/src/tokens.rs @@ -0,0 +1,73 @@ +use logos::Logos; + +#[derive(Debug, PartialEq, Logos)] +pub enum Token { + #[regex("[ \t]+")] + Spaces, + + #[regex("[\n\r]")] + Newline, + + #[regex("[0-9]+(\\.[0-9]+)?", |lex| lex.slice().parse().ok())] + Num(f64), + + #[token("+")] + OpAdd, + + #[token("-")] + OpSub, + + #[token("*")] + OpMul, + + #[token("/")] + OpDiv, + + #[token("^")] + OpPow, + + #[token("(")] + LParen, + + #[token(")")] + RParen, + + #[token("[")] + LBracket, + + #[token("]")] + RBracket, + + #[token("t")] + Time, + + #[token("T")] + TimeRef, + + #[token("x")] + PositionX, + + #[token("y")] + PositionY, + + #[token("z")] + PositionZ, + + #[token(":")] + Colon, + + #[token("parametric")] + ParametricGenerator, + + #[token("|")] + FillerLine, + + #[token("@")] + AtTimeLine, + + #[token("=")] + GeneratorLine, + + #[token("#")] + ParameterLine, +} diff --git a/on-host/arpist-traject/test.txt b/on-host/arpist-traject/test.txt new file mode 100644 index 0000000..e95c6ef --- /dev/null +++ b/on-host/arpist-traject/test.txt @@ -0,0 +1,8 @@ +@ T+0 +| += [parametric] +# x: 0.03*t +# y: 0.02*t +# z: 3*t^2 +| +@ T+10 -- GitLab