1pub mod ast;
2mod builder;
3mod diagnostics;
4mod literals;
5
6use pest::Parser;
7use pest_derive::Parser;
8
9use builder::build_program;
10use diagnostics::convert_pest_error;
11pub use diagnostics::ParseError;
12
13#[derive(Parser)]
14#[grammar = "parser/r.pest"]
15pub struct RParser;
16
17pub fn parse_program(input: &str) -> Result<ast::Expr, Box<ParseError>> {
18 let pairs =
19 RParser::parse(Rule::program, input).map_err(|e| Box::new(convert_pest_error(e, input)))?;
20
21 let pair = pairs
22 .into_iter()
23 .next()
24 .expect("successful parse always produces at least one pair");
25 Ok(build_program(pair))
26}