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