ripex 0.2.0

Multi-language structural parsing and fact extraction.
Documentation
pub mod declarations;
pub mod expressions;
pub mod recovery;
pub mod state;
pub mod statements;

pub use state::Parser;

use super::ast::{Program, Stmt};
use crate::span::Span;

pub fn parse_program(source: &str) -> (Program, Vec<crate::diagnostics::ParseError>) {
    let mut parser = Parser::new(source);
    let start = parser.token_start();
    let mut stmts = Vec::new();
    while parser.peek() != super::lexer::TokenKind::Eof {
        if parser.peek() == super::lexer::TokenKind::Newline {
            parser.advance();
            continue;
        }
        if parser.peek() == super::lexer::TokenKind::Dedent {
            parser.advance();
            continue;
        }
        let pos_before = parser.pos;
        stmts.push(parser.parse_stmt_recovery());
        if parser.pos == pos_before {
            parser.advance();
        }
    }
    let end = parser.prev_end();
    let program = Program {
        stmts,
        span: Span::new(start, end),
    };
    (program, parser.errors)
}

pub fn parse_script(source: &str) -> (Vec<Stmt>, Vec<crate::diagnostics::ParseError>) {
    let mut parser = Parser::new(source);
    let mut stmts = Vec::new();
    while parser.peek() != super::lexer::TokenKind::Eof {
        if parser.peek() == super::lexer::TokenKind::Newline {
            parser.advance();
            continue;
        }
        if parser.peek() == super::lexer::TokenKind::Dedent {
            parser.advance();
            continue;
        }
        let pos_before = parser.pos;
        stmts.push(parser.parse_stmt_recovery());
        if parser.pos == pos_before {
            parser.advance();
        }
    }
    (stmts, parser.errors)
}