1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use crate::lang::{TcEnv, UnionIndex};
use crate::desugar::{ParseEnv};
use lazy_static::lazy_static;
use prism_parser::error::aggregate_error::{AggregatedParseError, ParseResultExt};
use prism_parser::error::set_error::SetError;
use prism_parser::grammar::GrammarFile;
use prism_parser::parse_grammar;
use prism_parser::parser::parser_instance::run_parser_rule;
use prism_parser::rule_action::RuleAction;

lazy_static! {
    pub static ref GRAMMAR: GrammarFile<'static, RuleAction<'static, 'static>> =
        parse_grammar::<SetError>(include_str!("../resources/grammar")).unwrap_or_eprint();
}

pub fn parse_prism_in_env<'p>(
    program: &'p str,
    env: &mut TcEnv,
) -> Result<UnionIndex, AggregatedParseError<'p, SetError<'p>>> {
    let mut penv = ParseEnv::default();
    let idx = run_parser_rule::<SetError, _>(&GRAMMAR, "block", program, |r| {
        penv.insert_from_action_result(r, program)
    })?;
    Ok(env.insert_parse_env(&penv, idx))
}

pub fn parse_prism(program: &str) -> Result<(TcEnv, UnionIndex), AggregatedParseError<SetError>> {
    let mut env = TcEnv::default();
    parse_prism_in_env(program, &mut env).map(|i| (env, i))
}