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