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}