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/// An exit expression. 7/// 8/// ```trilogy 9/// exit 123 10/// ``` 11#[derive(Clone, Debug)] 12pub struct ExitExpression { 13 pub exit: Token, 14 pub expression: Expression, 15 pub span: Span, 16} 17 18impl Spanned for ExitExpression { 19 fn span(&self) -> Span { 20 self.span 21 } 22} 23 24impl ExitExpression { 25 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 26 let exit = parser.expect(KwExit).unwrap(); 27 let expression = Expression::parse_precedence(parser, Precedence::Continuation)?; 28 Ok(Self { 29 span: exit.span.union(expression.span()), 30 exit, 31 expression, 32 }) 33 } 34} 35 36#[cfg(test)] 37mod test { 38 use super::*; 39 40 test_parse!(exitexpr_unit: "exit unit" => ExitExpression::parse => ExitExpression { .. }); 41 test_parse!(exitexpr_value: "exit true" => ExitExpression::parse => ExitExpression { .. }); 42 test_parse_error!(exitexpr_empty: "exit" => ExitExpression::parse); 43}