summaryrefslogtreecommitdiff
path: root/src/syntax/tokens.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/syntax/tokens.rs')
-rw-r--r--src/syntax/tokens.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/syntax/tokens.rs b/src/syntax/tokens.rs
index 50eea455..24d8ecfb 100644
--- a/src/syntax/tokens.rs
+++ b/src/syntax/tokens.rs
@@ -34,6 +34,8 @@ pub enum Token<'s> {
LeftBrace,
/// A right brace in a function header: `}`.
RightBrace,
+ /// A double forward chevron in a function header: `>>`.
+ Chain,
/// A colon in a function header: `:`.
Colon,
@@ -108,6 +110,7 @@ impl<'s> Token<'s> {
RightParen => "closing paren",
LeftBrace => "opening brace",
RightBrace => "closing brace",
+ Chain => "function chain operator",
Colon => "colon",
Comma => "comma",
Equals => "equals sign",
@@ -218,6 +221,8 @@ impl<'s> Iterator for Tokens<'s> {
':' if self.mode == Header => Colon,
',' if self.mode == Header => Comma,
'=' if self.mode == Header => Equals,
+ '>' if self.mode == Header && self.peek() == Some('>') =>
+ self.read_chain(),
// Expression operators.
'+' if self.mode == Header => Plus,
@@ -308,6 +313,11 @@ impl<'s> Tokens<'s> {
}, true, 0, -2).0)
}
+ fn read_chain(&mut self) -> Token<'s> {
+ assert!(self.eat() == Some('>'));
+ Chain
+ }
+
fn read_whitespace(&mut self, start: Pos) -> Token<'s> {
self.read_string_until(|n| !n.is_whitespace(), false, 0, 0);
let end = self.pos();
@@ -490,6 +500,7 @@ mod tests {
LeftBracket as L, RightBracket as R,
LeftParen as LP, RightParen as RP,
LeftBrace as LB, RightBrace as RB,
+ Chain,
Ident as Id,
Bool,
Number as Num,
@@ -576,8 +587,10 @@ mod tests {
t!(Header, "120%" => Num(1.2));
t!(Header, "12e4%" => Num(1200.0));
t!(Header, "__main__" => Id("__main__"));
+ t!(Header, ">main" => Invalid(">main"));
t!(Header, ".func.box" => Id(".func.box"));
t!(Header, "arg, _b, _1" => Id("arg"), Comma, S(0), Id("_b"), Comma, S(0), Id("_1"));
+ t!(Header, "f: arg >> g" => Id("f"), Colon, S(0), Id("arg"), S(0), Chain, S(0), Id("g"));
t!(Header, "12_pt, 12pt" => Invalid("12_pt"), Comma, S(0), Len(Length::pt(12.0)));
t!(Header, "1e5in" => Len(Length::inches(100000.0)));
t!(Header, "2.3cm" => Len(Length::cm(2.3)));