Skip to main content

zuzu_rust/
lib.rs

1pub mod ast;
2pub mod codegen;
3pub mod error;
4pub mod infer;
5pub mod lexer;
6pub mod optimizer;
7pub mod parser;
8pub mod runtime;
9pub mod sema;
10pub mod span;
11pub mod token;
12pub mod web;
13
14pub use ast::{Expression, Program};
15pub use error::{Result, ZuzuRustError};
16pub use optimizer::{OptimizationLevel, OptimizationOptions, OptimizationPass};
17pub use runtime::{
18    module_search_roots, ExecutionOutput, HostValue, LoadedScript, Runtime, RuntimePolicy,
19};
20
21#[derive(Debug, Clone, PartialEq, Eq)]
22pub struct ParseOptions {
23    pub run_sema: bool,
24    pub infer_types: bool,
25    pub optimizations: OptimizationOptions,
26}
27
28impl Default for ParseOptions {
29    fn default() -> Self {
30        Self {
31            run_sema: true,
32            infer_types: true,
33            optimizations: OptimizationOptions::default(),
34        }
35    }
36}
37
38impl ParseOptions {
39    pub fn new(run_sema: bool, infer_types: bool, optimizations: OptimizationOptions) -> Self {
40        Self {
41            run_sema,
42            infer_types,
43            optimizations,
44        }
45    }
46}
47
48pub fn parse_program(source: &str) -> Result<Program> {
49    parse_program_with_options(source, true, true)
50}
51
52pub fn parse_program_with_options(
53    source: &str,
54    run_sema: bool,
55    infer_types: bool,
56) -> Result<Program> {
57    parse_program_with_compile_options(
58        source,
59        &ParseOptions::new(run_sema, infer_types, OptimizationOptions::disabled()),
60    )
61}
62
63pub fn parse_program_with_options_and_source_file(
64    source: &str,
65    run_sema: bool,
66    infer_types: bool,
67    source_file: Option<&str>,
68) -> Result<Program> {
69    parse_program_with_compile_options_and_source_file(
70        source,
71        &ParseOptions::new(run_sema, infer_types, OptimizationOptions::disabled()),
72        source_file,
73    )
74}
75
76pub fn parse_program_with_compile_options(source: &str, options: &ParseOptions) -> Result<Program> {
77    parse_program_with_compile_options_and_source_file(source, options, None)
78}
79
80pub fn parse_program_with_compile_options_and_source_file(
81    source: &str,
82    options: &ParseOptions,
83    source_file: Option<&str>,
84) -> Result<Program> {
85    let tokens = lexer::lex(source).map_err(|err| err.with_source_file(source_file))?;
86    let mut parser = match source_file {
87        Some(source_file) => parser::Parser::with_source_file(tokens, source_file),
88        None => parser::Parser::new(tokens),
89    };
90    let mut program = parser
91        .parse_program()
92        .map_err(|err| err.with_source_file(source_file))?;
93    if options.run_sema {
94        sema::validate_program(&program).map_err(|err| err.with_source_file(source_file))?;
95    }
96    if options.infer_types {
97        infer::annotate_program(&mut program);
98    }
99    optimizer::optimize_program(&mut program, &options.optimizations);
100    Ok(program)
101}
102
103pub fn parse_expression(source: &str) -> Result<Expression> {
104    parse_expression_with_source_file(source, None)
105}
106
107pub fn parse_expression_with_source_file(
108    source: &str,
109    source_file: Option<&str>,
110) -> Result<Expression> {
111    let tokens = lexer::lex(source).map_err(|err| err.with_source_file(source_file))?;
112    match source_file {
113        Some(source_file) => parser::Parser::with_source_file(tokens, source_file),
114        None => parser::Parser::new(tokens),
115    }
116    .parse_expression_root()
117    .map_err(|err| err.with_source_file(source_file))
118}