diff --git a/on-host/arpist-traject/src/syntax.rs b/on-host/arpist-traject/src/syntax.rs index 7d92614c27f67e60a48d40b4655e6121465630a9..dcedcc998ae62fd0f7239b0f4750b36e423dac2f 100644 --- a/on-host/arpist-traject/src/syntax.rs +++ b/on-host/arpist-traject/src/syntax.rs @@ -17,24 +17,24 @@ pub enum Lines { struct Parameter { span: Range<usize>, name: String, - value: Expr, + value: TimeExpr, } #[derive(Debug, Clone)] -enum Expr { +enum TimeExpr { Op(Box<Operation>), Num(Number), TimeVar(TimeVar), Group(GroupExpr), } -impl Expr { +impl TimeExpr { fn span(&self) -> Range<usize> { match self { - Expr::Op(op) => op.span.clone(), - Expr::Num(num) => num.span.clone(), - Expr::TimeVar(tv) => tv.span.clone(), - Expr::Group(expr) => expr.span.clone(), + TimeExpr::Op(op) => op.span.clone(), + TimeExpr::Num(num) => num.span.clone(), + TimeExpr::TimeVar(tv) => tv.span.clone(), + TimeExpr::Group(expr) => expr.span.clone(), } } } @@ -42,15 +42,15 @@ impl Expr { #[derive(Debug, Clone)] struct GroupExpr { span: Range<usize>, - value: Box<Expr>, + value: Box<TimeExpr>, } #[derive(Debug, Clone)] struct Operation { span: Range<usize>, op: Operator, - lhs: Box<Expr>, - rhs: Box<Expr>, + lhs: Box<TimeExpr>, + rhs: Box<TimeExpr>, } #[derive(Debug, Clone)] @@ -76,7 +76,7 @@ struct Generator { #[derive(Debug, Clone)] enum GeneratorKind { - Parametric, + PositionParametric, } #[derive(Debug, Clone)] diff --git a/on-host/arpist-traject/src/syntax/parser.rs b/on-host/arpist-traject/src/syntax/parser.rs index 0230ea8116885832dd0ec58c6bc463f87e7e08b7..892dcbaf0cf98afffbc7a476f91e998f359cbb3f 100644 --- a/on-host/arpist-traject/src/syntax/parser.rs +++ b/on-host/arpist-traject/src/syntax/parser.rs @@ -246,13 +246,13 @@ impl<'a, 'b> LexerView<'a> { // }) // } -fn parse_expr(mut view: LexerView<'_>) -> Option<Expr> { +fn parse_expr(mut view: LexerView<'_>) -> Option<TimeExpr> { let res = parse_sum(view.view()); view.commit(); res } -fn parse_sum(mut view: LexerView<'_>) -> Option<Expr> { +fn parse_sum(mut view: LexerView<'_>) -> Option<TimeExpr> { let lhs = parse_product(view.view())?; consume_any_space(view.view()); let res = match view.peek() { @@ -260,7 +260,7 @@ fn parse_sum(mut view: LexerView<'_>) -> Option<Expr> { view.next(); consume_any_space(view.view()); let rhs = parse_sum(view.view())?; - Expr::Op(Box::new(Operation { + TimeExpr::Op(Box::new(Operation { span: lhs.span().start..rhs.span().end, op: Operator::Add, lhs: Box::new(lhs), @@ -271,7 +271,7 @@ fn parse_sum(mut view: LexerView<'_>) -> Option<Expr> { view.next(); consume_any_space(view.view()); let rhs = parse_sum(view.view())?; - Expr::Op(Box::new(Operation { + TimeExpr::Op(Box::new(Operation { span: lhs.span().start..rhs.span().end, op: Operator::Sub, lhs: Box::new(lhs), @@ -284,7 +284,7 @@ fn parse_sum(mut view: LexerView<'_>) -> Option<Expr> { Some(res) } -fn parse_product(mut view: LexerView<'_>) -> Option<Expr> { +fn parse_product(mut view: LexerView<'_>) -> Option<TimeExpr> { let lhs = parse_power(view.view())?; consume_any_space(view.view()); let res = match view.peek() { @@ -292,7 +292,7 @@ fn parse_product(mut view: LexerView<'_>) -> Option<Expr> { view.next(); consume_any_space(view.view()); let rhs = parse_product(view.view())?; - Expr::Op(Box::new(Operation { + TimeExpr::Op(Box::new(Operation { span: lhs.span().start..rhs.span().end, op: Operator::Mul, lhs: Box::new(lhs), @@ -303,7 +303,7 @@ fn parse_product(mut view: LexerView<'_>) -> Option<Expr> { view.next(); consume_any_space(view.view()); let rhs = parse_product(view.view())?; - Expr::Op(Box::new(Operation { + TimeExpr::Op(Box::new(Operation { span: lhs.span().start..rhs.span().end, op: Operator::Div, lhs: Box::new(lhs), @@ -312,7 +312,7 @@ fn parse_product(mut view: LexerView<'_>) -> Option<Expr> { } Some((Token::Time, _)) => { let rhs = parse_power(view.view())?; - Expr::Op(Box::new(Operation { + TimeExpr::Op(Box::new(Operation { span: lhs.span().start..rhs.span().end, op: Operator::Mul, lhs: Box::new(lhs), @@ -325,14 +325,14 @@ fn parse_product(mut view: LexerView<'_>) -> Option<Expr> { Some(res) } -fn parse_power(mut view: LexerView<'_>) -> Option<Expr> { +fn parse_power(mut view: LexerView<'_>) -> Option<TimeExpr> { let lhs = parse_expr_value(view.view())?; consume_any_space(view.view()); let res = if let Some((Token::OpPow, _)) = view.peek() { view.next(); consume_any_space(view.view()); let rhs = parse_power(view.view())?; - Expr::Op(Box::new(Operation { + TimeExpr::Op(Box::new(Operation { span: lhs.span().start..rhs.span().end, op: Operator::Pow, lhs: Box::new(lhs), @@ -345,20 +345,20 @@ fn parse_power(mut view: LexerView<'_>) -> Option<Expr> { Some(res) } -fn parse_expr_value(mut view: LexerView<'_>) -> Option<Expr> { +fn parse_expr_value(mut view: LexerView<'_>) -> Option<TimeExpr> { println!("{:?}", view.peek()); println!("parse_expr_value"); if let Some(number) = parse_number(view.view()) { view.commit(); - return Some(Expr::Num(number)); + return Some(TimeExpr::Num(number)); } if let Some(time_var) = parse_time_var(view.view()) { view.commit(); - return Some(Expr::TimeVar(time_var)); + return Some(TimeExpr::TimeVar(time_var)); } if let Some(group) = parse_group(view.view()) { view.commit(); - return Some(Expr::Group(group)); + return Some(TimeExpr::Group(group)); } None @@ -439,7 +439,7 @@ mod tests { lex.next(); assert_eq!(parse_number(lex.view()).unwrap().value, 12.2); - let mut lex = CachedLexer::new("T12.2"); + let mut lex = CachedLexer::new("t12.2"); assert!(parse_number(lex.view()).is_none()); lex.next(); assert_eq!(parse_number(lex.view()).unwrap().value, 12.2); diff --git a/on-host/arpist-traject/src/tokens.rs b/on-host/arpist-traject/src/tokens.rs index 38775805f50f052322bba5e5a219c267e9befc65..e0216d3e17d8c385e7e4afa00ea22811afb3d91b 100644 --- a/on-host/arpist-traject/src/tokens.rs +++ b/on-host/arpist-traject/src/tokens.rs @@ -32,32 +32,17 @@ pub enum Token { #[token(")")] RParen, - #[token("[")] - LBracket, - - #[token("]")] - RBracket, - #[token("t")] Time, - #[token("T")] - TimeRef, - - #[token("x")] - PositionX, - - #[token("y")] - PositionY, + #[regex("T[+-]?[0-9]+(\\.[0-9]+)?", |lex| lex.slice()[1..].parse::<f64>().ok())] + TimeRef(f64), - #[token("z")] - PositionZ, + #[regex("[a-z]+ *:", |lex| lex.slice().trim_end_matches(':').trim().to_string())] + Parameter(String), - #[token(":")] - Colon, - - #[token("parametric")] - ParametricGenerator, + #[regex("\\[[a-zA-Z.]+\\]", |lex| lex.slice().trim_matches('[').trim_matches(']').to_string())] + Generator(String), #[token("|")] FillerLine, @@ -66,8 +51,11 @@ pub enum Token { AtTimeLine, #[token("=")] - GeneratorLine, + SettingLine, #[token("#")] + GeneratorLine, + + #[token("\\")] ParameterLine, } diff --git a/on-host/test.txt b/on-host/test.txt index e95c6ef9b51c733662203446879833cac9e5703a..a1532724cf30d21d1f4b6d9eb496be5d7b66dc0b 100644 --- a/on-host/test.txt +++ b/on-host/test.txt @@ -1,8 +1,13 @@ += [GPS] +\ x: 0 +\ y: 0 +\ z: 0 +| @ T+0 | -= [parametric] -# x: 0.03*t -# y: 0.02*t -# z: 3*t^2 +# [position.parametric] +\ x : 0.03*t +\ y : 0.02*t +\ z : 3*t^2 | @ T+10