Actually just three programming languages in a trenchcoat
at main 47 lines 1.5 kB view raw
1use super::*; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType::*}; 5 6#[derive(Clone, Debug)] 7pub struct ParenthesizedQuery { 8 pub open_paren: Token, 9 pub query: Query, 10 pub close_paren: Token, 11 pub span: Span, 12} 13 14impl Spanned for ParenthesizedQuery { 15 fn span(&self) -> Span { 16 self.span 17 } 18} 19 20impl ParenthesizedQuery { 21 pub(crate) fn parse_or_pattern(parser: &mut Parser) -> SyntaxResult<Result<Self, Pattern>> { 22 let open_paren = parser 23 .expect(OParen) 24 .map_err(|token| parser.expected(token, "expected `(`"))?; 25 match Query::parse_or_pattern_parenthesized(parser)? { 26 Ok(query) => { 27 let close_paren = parser 28 .expect(CParen) 29 .map_err(|token| parser.expected(token, "expected `)`"))?; 30 Ok(Ok(Self { 31 span: open_paren.span.union(close_paren.span), 32 open_paren, 33 query, 34 close_paren, 35 })) 36 } 37 Err(pattern) => { 38 let parenthesized = Pattern::Parenthesized(Box::new(ParenthesizedPattern::finish( 39 parser, open_paren, pattern, 40 )?)); 41 let pattern = 42 Pattern::parse_suffix(parser, pattern::Precedence::None, parenthesized)?; 43 Ok(Err(pattern)) 44 } 45 } 46 } 47}