Skip to content

Commit 978829f

Browse files
committed
Implement Tok::Comment
1 parent 9175081 commit 978829f

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

compiler/parser/python.lalrpop

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,5 +1414,6 @@ extern {
14141414
name => lexer::Tok::Name { name: <String> },
14151415
"\n" => lexer::Tok::Newline,
14161416
";" => lexer::Tok::Semi,
1417+
"#" => lexer::Tok::Comment,
14171418
}
14181419
}

compiler/parser/src/lexer.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -399,13 +399,16 @@ where
399399
}
400400

401401
/// Skip everything until end of line
402-
fn lex_comment(&mut self) {
402+
fn lex_comment(&mut self) -> LexResult {
403+
let start_pos = self.get_pos();
403404
self.next_char();
404405
loop {
405406
match self.chr0 {
406-
Some('\n') => return,
407+
Some('\n') | None => {
408+
let end_pos = self.get_pos();
409+
return Ok((start_pos, Tok::Comment, end_pos));
410+
}
407411
Some(_) => {}
408-
None => return,
409412
}
410413
self.next_char();
411414
}
@@ -690,7 +693,8 @@ where
690693
tabs += 1;
691694
}
692695
Some('#') => {
693-
self.lex_comment();
696+
let comment = self.lex_comment()?;
697+
self.emit(comment);
694698
spaces = 0;
695699
tabs = 0;
696700
}
@@ -832,7 +836,8 @@ where
832836
self.emit(number);
833837
}
834838
'#' => {
835-
self.lex_comment();
839+
let comment = self.lex_comment()?;
840+
self.emit(comment);
836841
}
837842
'"' | '\'' => {
838843
let string = self.lex_string(false, false, false, false)?;
@@ -1350,7 +1355,7 @@ mod tests {
13501355
fn $name() {
13511356
let source = format!(r"99232 # {}", $eol);
13521357
let tokens = lex_source(&source);
1353-
assert_eq!(tokens, vec![Tok::Int { value: BigInt::from(99232) }, Tok::Newline]);
1358+
assert_eq!(tokens, vec![Tok::Int { value: BigInt::from(99232) }, Tok::Comment, Tok::Newline]);
13541359
}
13551360
)*
13561361
}
@@ -1374,6 +1379,7 @@ mod tests {
13741379
tokens,
13751380
vec![
13761381
Tok::Int { value: BigInt::from(123) },
1382+
Tok::Comment,
13771383
Tok::Newline,
13781384
Tok::Int { value: BigInt::from(456) },
13791385
Tok::Newline,

compiler/parser/src/parser.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
//! parse a whole program, a single statement, or a single
66
//! expression.
77
8-
use crate::lexer::LexResult;
8+
use crate::lexer::{LexResult, Tok};
99
pub use crate::mode::Mode;
1010
use crate::{ast, error::ParseError, lexer, python};
11+
use itertools::Itertools;
1112
use std::iter;
1213

1314
/*
@@ -74,7 +75,9 @@ pub fn parse_expression(source: &str, path: &str) -> Result<ast::Expr, ParseErro
7475
pub fn parse(source: &str, mode: Mode, source_path: &str) -> Result<ast::Mod, ParseError> {
7576
let lxr = lexer::make_tokenizer(source);
7677
let marker_token = (Default::default(), mode.to_marker(), Default::default());
77-
let tokenizer = iter::once(Ok(marker_token)).chain(lxr);
78+
let tokenizer = iter::once(Ok(marker_token))
79+
.chain(lxr)
80+
.filter_ok(|(_, tok, _)| !matches!(tok, Tok::Comment));
7881

7982
python::TopParser::new()
8083
.parse(tokenizer)
@@ -88,7 +91,9 @@ pub fn parse_tokens(
8891
source_path: &str,
8992
) -> Result<ast::Mod, ParseError> {
9093
let marker_token = (Default::default(), mode.to_marker(), Default::default());
91-
let tokenizer = iter::once(Ok(marker_token)).chain(lxr);
94+
let tokenizer = iter::once(Ok(marker_token))
95+
.chain(lxr)
96+
.filter_ok(|(_, tok, _)| !matches!(tok, Tok::Comment));
9297

9398
python::TopParser::new()
9499
.parse(tokenizer)

compiler/parser/src/token.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub enum Tok {
2525
Rsqb,
2626
Colon,
2727
Comma,
28+
Comment,
2829
Semi,
2930
Plus,
3031
Minus,
@@ -155,6 +156,7 @@ impl fmt::Display for Tok {
155156
Rsqb => f.write_str("']'"),
156157
Colon => f.write_str("':'"),
157158
Comma => f.write_str("','"),
159+
Comment => f.write_str("#"),
158160
Semi => f.write_str("';'"),
159161
Plus => f.write_str("'+'"),
160162
Minus => f.write_str("'-'"),

0 commit comments

Comments
 (0)