Actually just three programming languages in a trenchcoat
at string-repr-callable 43 lines 1.2 kB view raw
1use super::{expression::Precedence, *}; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType::*}; 5 6/// A continue expression. 7/// 8/// ```trilogy 9/// continue unit 10/// ``` 11#[derive(Clone, Debug, PrettyPrintSExpr)] 12pub struct ContinueExpression { 13 pub r#continue: Token, 14 pub expression: Expression, 15 span: Span, 16} 17 18impl ContinueExpression { 19 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 20 let r#continue = parser.expect(KwContinue).unwrap(); 21 let expression = Expression::parse_precedence(parser, Precedence::Continuation)?; 22 Ok(Self { 23 span: r#continue.span.union(expression.span()), 24 r#continue, 25 expression, 26 }) 27 } 28} 29 30impl Spanned for ContinueExpression { 31 fn span(&self) -> Span { 32 self.span 33 } 34} 35 36#[cfg(test)] 37mod test { 38 use super::*; 39 40 test_parse!(continueexpr_unit: "continue unit" => ContinueExpression::parse => "(ContinueExpression _ _)"); 41 test_parse!(continueexpr_value: "continue true" => ContinueExpression::parse => "(ContinueExpression _ _)"); 42 test_parse_error!(continueexpr_empty: "continue" => ContinueExpression::parse); 43}