Actually just three programming languages in a trenchcoat
at main 37 lines 952 B view raw
1use super::{query::Precedence, *}; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType::*}; 5 6#[derive(Clone, Debug)] 7pub struct QueryImplication { 8 pub r#if: Token, 9 pub lhs: Query, 10 pub then: Token, 11 pub rhs: Query, 12 pub span: Span, 13} 14 15impl Spanned for QueryImplication { 16 fn span(&self) -> Span { 17 self.span 18 } 19} 20 21impl QueryImplication { 22 pub(crate) fn parse(parser: &mut Parser) -> SyntaxResult<Self> { 23 let r#if = parser.expect(KwIf).unwrap(); 24 let lhs = Query::parse(parser)?; 25 let then = parser.expect(KwThen).map_err(|token| { 26 parser.expected(token, "expected `then` to follow implication query") 27 })?; 28 let rhs = Query::parse_precedence(parser, Precedence::Implication)?; 29 Ok(Self { 30 span: r#if.span.union(rhs.span()), 31 r#if, 32 lhs, 33 then, 34 rhs, 35 }) 36 } 37}