authorchloe caruso <git@paperclover.net> 2024-02-04 10:10:09-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-02-04 10:10:09-08:00
logd0e4a653989fb012e7b7c01eebb76c655c3393a1
treed1875641207065e29bb81390922e43bef1b86585
parentaeeab025ce0b9698e869be9a04033dd327cb0ad0

chore: remove top level statement and add some new tokens (#18)

* chore: remove top level statement and add some more things * revisions

11 files changed, 60 insertions(+), 73 deletions(-)

Cargo.toml+1-1
......@@ -1,6 +1,6 @@
11[workspace.package]
22version = "0.1.0"
3edition = "2023"
3edition = "2021"
44license = "MIT"
55authors = ["Lino Le Van", "Dave Caruso"]
66repository = "https://github.com/lino-levan/blight"
crates/ast/ast.rs+1-39
......@@ -11,7 +11,7 @@ pub enum BuiltinId {
1111#[derive(Debug, Clone)]
1212pub struct Module {
1313 pub comment: Option<DocComment>,
14 pub statements: Vec<TopLevelStatement>,
14 pub statements: Vec<Statement>,
1515}
1616
1717#[derive(Debug, Clone)]
......@@ -177,14 +177,6 @@ pub enum Statement {
177177 Comment(Comment),
178178}
179179
180#[derive(Debug, Clone)]
181pub enum TopLevelStatement {
182 Expr(Expr),
183 VarDecl(VarDecl),
184 FnDecl(FnDecl),
185 Comment(Comment),
186}
187
188180impl BuiltinId {
189181 pub fn display_name(&self) -> &'static str {
190182 match self {
......@@ -201,15 +193,6 @@ impl BuiltinId {
201193}
202194
203195impl Statement {
204 pub fn to_top_level(self) -> TopLevelStatement {
205 match self {
206 Statement::Expr(expr) => TopLevelStatement::Expr(expr),
207 Statement::VarDecl(decl) => TopLevelStatement::VarDecl(decl),
208 Statement::FnDecl(decl) => TopLevelStatement::FnDecl(decl),
209 Statement::Comment(comment) => TopLevelStatement::Comment(comment),
210 }
211 }
212
213196 /// This is stupid function im sorry
214197 pub fn require_semicolon(&self, semicolon_hint: bool) -> bool {
215198 match &self {
......@@ -226,24 +209,3 @@ impl Statement {
226209 }
227210 }
228211}
229
230impl TopLevelStatement {
231 /// This is stupid function im sorry
232 pub fn require_semicolon(&self, earlier_hint: bool) -> bool {
233 match &self {
234 TopLevelStatement::Expr(_) => !earlier_hint,
235 TopLevelStatement::VarDecl(_) => true,
236 TopLevelStatement::FnDecl(_) => false,
237 _ => false,
238 }
239 }
240
241 pub fn to_statement(self) -> Option<Statement> {
242 match self {
243 TopLevelStatement::Expr(expr) => Some(Statement::Expr(expr)),
244 TopLevelStatement::VarDecl(decl) => Some(Statement::VarDecl(decl)),
245 TopLevelStatement::FnDecl(decl) => Some(Statement::FnDecl(decl)),
246 TopLevelStatement::Comment(comment) => Some(Statement::Comment(comment)),
247 }
248 }
249}
crates/js_ast/convert/mod.rs+1-1
......@@ -35,7 +35,7 @@ pub fn blight_to_js(blight: Module) -> JsModule {
3535 let mut root_context = BlockConvertContext::new();
3636
3737 for statement in blight.statements {
38 process_top_level_statement(&mut root_context, statement).unwrap();
38 process_statement(&mut root_context, statement).unwrap();
3939 }
4040
4141 root_context.into()
crates/js_ast/convert/process_statement.rs-10
......@@ -96,13 +96,3 @@ pub fn process_statement(ctx: &mut BlockConvertContext, statement: Statement) ->
9696 Statement::Comment(_) => Some(()),
9797 }
9898}
99
100pub fn process_top_level_statement(
101 ctx: &mut BlockConvertContext,
102 statement: TopLevelStatement,
103) -> Option<()> {
104 match statement.to_statement() {
105 Some(stmt) => process_statement(ctx, stmt),
106 None => todo!("process_top_level_statement"),
107 }
108}
crates/parser/parse_fn_declaration.rs+2-2
......@@ -78,7 +78,7 @@ pub fn parse_fn_declaration(
7878 }
7979
8080 let return_type = match p.peek() {
81 Some(TokenType::RightArrow) => {
81 Some(TokenType::MinusLt) => {
8282 _ = p.next();
8383 parse_type(p)?
8484 }
......@@ -98,7 +98,7 @@ pub fn parse_fn_declaration(
9898 None,
9999 )
100100 }
101 Some(TokenType::BigRightArrow) => {
101 Some(TokenType::EqualLt) => {
102102 _ = p.next();
103103 parse_expr(p)?
104104 }
crates/parser/parse_module.rs+2-2
......@@ -1,5 +1,5 @@
11use crate::parse_doc_comment::maybe_read_doc_comment;
2use crate::parse_top_level_statement::parse_top_level_statement;
2use crate::parse_statement::parse_statement;
33use crate::Parser;
44use ast::Module;
55use miette::Result;
......@@ -15,7 +15,7 @@ pub fn parse_module(p: &mut Parser) -> Result<Module> {
1515 .peek()
1616 .map_or(false, |x| x.is_start_of_statement_like_expression());
1717
18 let statement = parse_top_level_statement(p)?;
18 let statement = parse_statement(p)?;
1919
2020 match p.peek() {
2121 Some(TokenType::Semicolon) => {
crates/parser/parse_statement.rs+20-1
......@@ -28,7 +28,7 @@ pub fn parse_statement(p: &mut Parser) -> Result<Statement> {
2828 Some(TokenType::Pub) => {
2929 if !p.is_top_level {
3030 return Err(p
31 .error("Public declarations are not allowed inside of functions".to_string())
31 .error("Public declarations are only allowed at the top level".to_string())
3232 .into());
3333 }
3434 _ = p.next();
......@@ -55,6 +55,25 @@ pub fn parse_statement(p: &mut Parser) -> Result<Statement> {
5555 false,
5656 m_doc_comment,
5757 )?)),
58 Some(TokenType::Defer) => {
59 let label = p.peek().unwrap();
60 Err(p
61 .error(format!("'{}' is not yet implemented", label))
62 .into())
63 }
64 Some(TokenType::Struct | TokenType::Enum | TokenType::Trait | TokenType::Impl) => {
65 let label = p.peek().unwrap();
66 if !p.is_top_level {
67 return Err(p
68 .error(format!("'{}' is only allowed at the top level", label))
69 .into());
70 }
71
72 Err(p
73 .error(format!("'{}' is not yet implemented", label))
74 .into())
75 }
76
5877 Some(_) => {
5978 if let Some(doc_comment) = m_doc_comment {
6079 Err(p
crates/parser/parse_top_level_statement.rs deleted-10
......@@ -1,10 +0,0 @@
1use ast::TopLevelStatement;
2use miette::Result;
3
4use crate::{parse_statement::parse_statement, Parser};
5
6/// Precondition: the next token exists
7pub fn parse_top_level_statement(p: &mut Parser) -> Result<TopLevelStatement> {
8 // TODO: we will eventually have real statements that are exclusive to top-level
9 Ok(parse_statement(p)?.to_top_level())
10}
crates/parser/parser.rs-1
......@@ -9,7 +9,6 @@ mod parse_fn_declaration;
99mod parse_module;
1010mod parse_param;
1111mod parse_statement;
12mod parse_top_level_statement;
1312mod parse_type;
1413
1514use ast::Comment;
crates/tokenizer/tokenizer.rs+21-6
......@@ -19,13 +19,18 @@ pub enum TokenType {
1919 Comment(String),
2020 DocComment(String),
2121 // Keywords
22 Defer,
2223 Else,
24 Enum,
2325 False,
2426 Fn,
2527 If,
28 Impl,
2629 Let,
2730 Pub,
2831 Return,
32 Struct,
33 Trait,
2934 True,
3035 Var,
3136 Void,
......@@ -34,7 +39,7 @@ pub enum TokenType {
3439 AndAnd, // &&
3540 Bang, // !
3641 BangEqual, // !=
37 BigRightArrow, // =>
42 EqualLt, // =>
3843 Caret, // ^
3944 ClosedBrace, // }
4045 ClosedBracket, // ]
......@@ -59,7 +64,7 @@ pub enum TokenType {
5964 OrOr, // ||
6065 Percent, // %
6166 Plus, // +
62 RightArrow, // ->
67 MinusLt, // ->
6368 Semicolon, // ;
6469 Slash, // /
6570 Star, // *
......@@ -86,13 +91,18 @@ impl std::fmt::Display for TokenType {
8691 TokenType::Comment(_) => "comment".to_string(),
8792 TokenType::DocComment(_) => "documentation comment".to_string(),
8893
94 TokenType::Defer => "defer".to_string(),
8995 TokenType::Else => "else".to_string(),
96 TokenType::Enum => "enum".to_string(),
9097 TokenType::False => "false".to_string(),
9198 TokenType::Fn => "fn".to_string(),
9299 TokenType::If => "if".to_string(),
100 TokenType::Impl => "impl".to_string(),
93101 TokenType::Let => "let".to_string(),
94102 TokenType::Pub => "pub".to_string(),
95103 TokenType::Return => "return".to_string(),
104 TokenType::Struct => "struct".to_string(),
105 TokenType::Trait => "trait".to_string(),
96106 TokenType::True => "true".to_string(),
97107 TokenType::Var => "var".to_string(),
98108 TokenType::Void => "void".to_string(),
......@@ -101,7 +111,7 @@ impl std::fmt::Display for TokenType {
101111 TokenType::AndAnd => "&&".to_string(),
102112 TokenType::Bang => "!".to_string(),
103113 TokenType::BangEqual => "!=".to_string(),
104 TokenType::BigRightArrow => "=>".to_string(),
114 TokenType::EqualLt => "=>".to_string(),
105115 TokenType::Caret => "^".to_string(),
106116 TokenType::ClosedBrace => "}".to_string(),
107117 TokenType::ClosedBracket => "]".to_string(),
......@@ -126,7 +136,7 @@ impl std::fmt::Display for TokenType {
126136 TokenType::OrOr => "||".to_string(),
127137 TokenType::Percent => "%".to_string(),
128138 TokenType::Plus => "+".to_string(),
129 TokenType::RightArrow => "->".to_string(),
139 TokenType::MinusLt => "->".to_string(),
130140 TokenType::Semicolon => ";".to_string(),
131141 TokenType::Slash => "/".to_string(),
132142 TokenType::Star => "*".to_string(),
......@@ -183,13 +193,18 @@ pub fn tokenize(content: String) -> Result<Vec<Token>> {
183193 let length = current_token.len();
184194
185195 let variant = match current_token.as_str() {
196 "defer" => TokenType::Defer,
186197 "else" => TokenType::Else,
198 "enum" => TokenType::Enum,
187199 "false" => TokenType::False,
188200 "fn" => TokenType::Fn,
189201 "if" => TokenType::If,
202 "impl" => TokenType::Impl,
190203 "let" => TokenType::Let,
191204 "pub" => TokenType::Pub,
192205 "return" => TokenType::Return,
206 "struct" => TokenType::Struct,
207 "trait" => TokenType::Trait,
193208 "true" => TokenType::True,
194209 "var" => TokenType::Var,
195210 "void" => TokenType::Void,
......@@ -250,7 +265,7 @@ pub fn tokenize(content: String) -> Result<Vec<Token>> {
250265 }
251266 Some((_, '>')) => {
252267 chars.next();
253 Token::new(TokenType::BigRightArrow, start, 2)
268 Token::new(TokenType::EqualLt, start, 2)
254269 }
255270 _ => Token::new(TokenType::Equal, start, 1),
256271 },
......@@ -287,7 +302,7 @@ pub fn tokenize(content: String) -> Result<Vec<Token>> {
287302 '-' => match chars.peek() {
288303 Some((_, '>')) => {
289304 chars.next();
290 Token::new(TokenType::RightArrow, start, 2)
305 Token::new(TokenType::MinusLt, start, 2)
291306 }
292307 _ => Token::new(TokenType::Minus, start, 1),
293308 },
examples/basics/defer.blight created+12
......@@ -0,0 +1,12 @@
1let print = @raw("console.log");
2
3{
4 print("1");
5 defer print("6");
6 {
7 print("2");
8 defer print("4");
9 print("3");
10 }
11 print("5");
12}