From 36942adf09edc18453d53303aae8893e752bdce1 Mon Sep 17 00:00:00 2001 From: GreasySlug <9619abgoni@gmail.com> Date: Mon, 26 Dec 2022 16:05:35 +0900 Subject: [PATCH 1/4] fix: consume token and check indent after comment --- compiler/erg_parser/lex.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler/erg_parser/lex.rs b/compiler/erg_parser/lex.rs index b7700f8f..b741481f 100644 --- a/compiler/erg_parser/lex.rs +++ b/compiler/erg_parser/lex.rs @@ -323,6 +323,8 @@ impl Lexer /*<'a>*/ { (']', '#') => { nest_level -= 1; if nest_level == 0 { + self.consume(); // ] + self.consume(); // # return Ok(()); } } @@ -448,8 +450,11 @@ impl Lexer /*<'a>*/ { if let Err(e) = self.lex_multi_line_comment() { return Some(Err(e)); } - } - if let Err(e) = self.lex_comment() { + let indent_dedent = self.lex_space_indent_dedent(); + if indent_dedent.is_some() { + return indent_dedent; + } + } else if let Err(e) = self.lex_comment() { return Some(Err(e)); } } @@ -1059,8 +1064,11 @@ impl Iterator for Lexer /*<'a>*/ { if let Err(e) = self.lex_multi_line_comment() { return Some(Err(e)); } - } - if let Err(e) = self.lex_comment() { + let indent_dedent = self.lex_space_indent_dedent(); + if indent_dedent.is_some() { + return indent_dedent; + } + } else if let Err(e) = self.lex_comment() { return Some(Err(e)); } } From f5c290960d06700ddb2ee8faff0472e01d62501e Mon Sep 17 00:00:00 2001 From: GreasySlug <9619abgoni@gmail.com> Date: Mon, 26 Dec 2022 16:05:55 +0900 Subject: [PATCH 2/4] test: add should ok comment test --- tests/should_ok/comment.er | 7 +++++++ tests/test.rs | 5 +++++ 2 files changed, 12 insertions(+) create mode 100644 tests/should_ok/comment.er diff --git a/tests/should_ok/comment.er b/tests/should_ok/comment.er new file mode 100644 index 00000000..4cb9b9a0 --- /dev/null +++ b/tests/should_ok/comment.er @@ -0,0 +1,7 @@ +#[]#print! "hi"#[ if there isn't `;`, this code is evaluated `print! "hi"h print! "there"` +]#;print! "there" +print! #[]#0, 1#[]#, 2,#[]# 3 +a = { +#[first]# #[second]#name #[third]#=#[fourth]#"John"#[fifth]# +} +Del a \ No newline at end of file diff --git a/tests/test.rs b/tests/test.rs index b639df1a..a79ab89c 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -224,3 +224,8 @@ fn exec_callable() -> Result<(), ()> { fn exec_multiline_invalid_next() -> Result<(), ()> { expect_failure("tests/should_err/multi_line_invalid_nest.er", 1) } + +#[test] +fn exec_comment() -> Result<(), ()> { + expect_success("tests/should_ok/comment.er") +} From d329650bcf9961dc3eb6a253267c7b08ba8f76c8 Mon Sep 17 00:00:00 2001 From: GreasySlug <9619abgoni@gmail.com> Date: Mon, 26 Dec 2022 20:15:17 +0900 Subject: [PATCH 3/4] update: whitespace after multi comment is an error --- compiler/erg_parser/lex.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/compiler/erg_parser/lex.rs b/compiler/erg_parser/lex.rs index b741481f..45af3be8 100644 --- a/compiler/erg_parser/lex.rs +++ b/compiler/erg_parser/lex.rs @@ -450,10 +450,6 @@ impl Lexer /*<'a>*/ { if let Err(e) = self.lex_multi_line_comment() { return Some(Err(e)); } - let indent_dedent = self.lex_space_indent_dedent(); - if indent_dedent.is_some() { - return indent_dedent; - } } else if let Err(e) = self.lex_comment() { return Some(Err(e)); } @@ -1064,10 +1060,6 @@ impl Iterator for Lexer /*<'a>*/ { if let Err(e) = self.lex_multi_line_comment() { return Some(Err(e)); } - let indent_dedent = self.lex_space_indent_dedent(); - if indent_dedent.is_some() { - return indent_dedent; - } } else if let Err(e) = self.lex_comment() { return Some(Err(e)); } From 21f5b70ab369658cd882f1410d7bed7eba44501d Mon Sep 17 00:00:00 2001 From: GreasySlug <9619abgoni@gmail.com> Date: Mon, 26 Dec 2022 20:17:03 +0900 Subject: [PATCH 4/4] test: remove whitespace after comments. --- tests/should_ok/comment.er | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/should_ok/comment.er b/tests/should_ok/comment.er index 4cb9b9a0..306824c1 100644 --- a/tests/should_ok/comment.er +++ b/tests/should_ok/comment.er @@ -1,7 +1,11 @@ #[]#print! "hi"#[ if there isn't `;`, this code is evaluated `print! "hi"h print! "there"` ]#;print! "there" -print! #[]#0, 1#[]#, 2,#[]# 3 +print! #[]#0, 1#[]#, 2,#[]#3 a = { -#[first]# #[second]#name #[third]#=#[fourth]#"John"#[fifth]# + #[first]#name #[second]#=#[third]#"John"#[fouth]# } -Del a \ No newline at end of file +Del a +#[]#print! 0 +print!#[]#1 +#[]#print! 2#[ +]# \ No newline at end of file