Actually just three programming languages in a trenchcoat
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}