pipeline_script/parser/
mod.rs1use crate::ast::module::Module;
2use crate::ast::r#struct::{Struct, StructField};
3use crate::ast::r#type::Type;
4use crate::context::Context;
5use crate::core::result::Result;
6use crate::lexer::iter::TokenStream;
7use crate::lexer::token::Token;
8use crate::lexer::Lexer;
9use slotmap::DefaultKey;
10use std::vec;
11
12mod expr;
13mod function;
14mod helper;
15mod ptype;
16mod stmt;
17
18pub struct Parser {
19 token_stream: TokenStream,
20 module: DefaultKey,
21 parent_module: DefaultKey,
22 current_module: DefaultKey,
23 function_keyword: String,
24 var_keyword: String,
25 val_keyword: String,
26}
27impl Parser {
28 pub fn new(lexer: Lexer, ctx: &Context) -> Self {
29 let name = lexer.get_file_name();
30 let module = ctx.register_module(Module::new(name));
31 Self {
32 token_stream: TokenStream::new(lexer),
33 current_module: module,
34 parent_module: module,
35 module,
36 function_keyword: "fn".into(),
37 var_keyword: "let".into(),
38 val_keyword: "const".into(),
39 }
40 }
41 pub fn parse_module(&mut self, ctx: &Context) -> Result<()> {
42 self.parse_keyword("module")?;
43 let (name, _) = self.parse_identifier()?;
44 let module = Module::new(name.clone());
45 let module = ctx.register_module(module);
46 self.parent_module = self.current_module;
47 self.current_module = module;
48 self.parse_special_token(Token::ParenLeft)?;
49 while !self.token_stream.is_eof() {
50 let stmt = self.parse_stmt(ctx)?;
51 if stmt.is_noop() {
52 break;
53 }
54 ctx.apply_mut_module(self.current_module, |m| m.add_stmt(stmt.clone()));
55 }
56 self.parse_special_token(Token::ParenRight)?;
57 ctx.apply_mut_module(self.parent_module, |m| {
58 m.register_submodule(&name, self.current_module)
59 });
60 Ok(())
61 }
62 pub fn parse(&mut self, ctx: &Context) -> Result<DefaultKey> {
63 while !self.token_stream.is_eof() {
64 let stmt = self.parse_stmt(ctx)?;
65 if stmt.is_noop() {
66 break;
67 }
68 ctx.apply_mut_module(self.module, |m| m.add_stmt(stmt.clone()));
69 }
70 Ok(self.module)
71 }
72
73 fn parse_struct(&mut self, ctx: &Context) -> Result<()> {
74 let _ = self.parse_keyword("struct")?;
75 let (struct_name, _) = self.parse_identifier()?;
76 let mut generic = vec![];
77 if self.next_is(Token::Less) {
78 generic = self.parse_generic_list().unwrap();
79 }
80 let _ = self.parse_special_token(Token::ParenLeft)?;
81 let mut fields = vec![];
82 loop {
83 let (token, _) = self.token_stream.peek();
84 match token {
85 Token::Identifier(id) => {
86 let _ = self.parse_identifier()?;
87 let _ = self.parse_special_token(Token::Colon)?;
88 let ty = self.parse_type()?;
89 fields.push(StructField::new(id, ty));
90 continue;
91 }
92 Token::Comma => {
93 self.parse_special_token(Token::Comma)?;
94 continue;
95 }
96 Token::ParenRight => {
97 self.parse_special_token(Token::ParenRight)?;
98 break;
99 }
100 _ => break,
101 }
102 }
103 let struct_declaration = Struct::new(struct_name.clone(), fields, generic.clone());
104 ctx.apply_mut_module(self.current_module, |m| {
105 m.register_struct(&struct_name, struct_declaration.clone())
106 });
107 Ok(())
108 }
109 fn parse_enum(&mut self, ctx: &Context) -> Result<()> {
110 let _ = self.parse_keyword("enum")?;
112
113 let (enum_name, _) = self.parse_identifier()?;
115
116 let generic = self.parse_type_generics().unwrap();
118
119 self.parse_special_token(Token::ParenLeft)?;
121
122 let mut variants = vec![];
124 loop {
125 let (token, _) = self.token_stream.peek();
126 match token {
127 Token::ParenRight => {
128 self.parse_special_token(Token::ParenRight)?;
129 break;
130 }
131 Token::Identifier(_) => {
132 let (variant_name, _) = self.parse_identifier()?;
133
134 let mut variant_type = None;
136 if self.try_parse_token(Token::BraceLeft) {
137 let ty = self.parse_type()?;
139 self.parse_special_token(Token::BraceRight)?;
140 variant_type = Some(ty);
141 }
142
143 variants.push((variant_name, variant_type));
144
145 if self.try_parse_token(Token::Comma) {
147 continue;
148 }
149 }
150 _ => {
151 break;
152 }
153 }
154 }
155
156 let enum_type = Type::Enum(Some(enum_name.clone()), variants);
158
159 ctx.apply_mut_module(self.current_module, |m| {
161 let generic = generic.iter().map(|it| it.as_str()).collect();
162 m.register_type_alias(&enum_name, enum_type.clone(), generic)
163 });
164 Ok(())
165 }
166 fn parse_trait(&mut self) {}
167}