Skip to main content

r/
parser.rs

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}