Skip to main content

ripex/go/parser/
mod.rs

1pub mod declarations;
2pub mod expressions;
3pub mod recovery;
4pub mod state;
5pub mod statements;
6
7pub use state::Parser;
8
9use super::ast::Program;
10use crate::span::Span;
11
12pub fn parse_program(source: &str) -> (Program, Vec<crate::diagnostics::ParseError>) {
13    let mut parser = Parser::new(source);
14    let start = parser.token_start();
15    let mut decls = Vec::new();
16    while parser.peek() != super::lexer::TokenKind::Eof {
17        let pos_before = parser.pos;
18        let stmt = parser.parse_stmt_recovery();
19        if parser.pos == pos_before {
20            break;
21        }
22        if let super::ast::stmt::Stmt::Decl(d, _) = stmt {
23            decls.push(d);
24        }
25    }
26    let end = parser.prev_end();
27    let program = Program {
28        decls,
29        span: Span::new(start, end),
30    };
31    (program, parser.errors)
32}
33
34pub fn parse_script(source: &str) -> (Vec<super::ast::Stmt>, Vec<crate::diagnostics::ParseError>) {
35    let mut parser = Parser::new(source);
36    let mut stmts = Vec::new();
37    while parser.peek() != super::lexer::TokenKind::Eof {
38        stmts.push(parser.parse_stmt_recovery());
39    }
40    (stmts, parser.errors)
41}