Skip to content

Commit ed1cacb

Browse files
author
DigitalCodeCrafter
committed
added comments
+ block comments can be nested + warning: block comments are not statement terminators and must be followed or leaded by a terminator to terminate a statement.
1 parent c5b0e59 commit ed1cacb

2 files changed

Lines changed: 50 additions & 4 deletions

File tree

src/syntax/lexer.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,13 @@ impl Lexer<'_> {
8181

8282
impl Lexer<'_> {
8383
fn next_token(&mut self, hint: LexHint) -> Token {
84-
self.skip_whitespace();
84+
let mut changed = true;
85+
while changed {
86+
let start = self.pos;
87+
self.skip_whitespace();
88+
self.skip_comment();
89+
changed = start != self.pos;
90+
}
8591

8692
let Some(c) = self.peek_char() else {
8793
return self.emit_eof();
@@ -132,6 +138,37 @@ impl Lexer<'_> {
132138
}
133139
}
134140

141+
fn skip_comment(&mut self) {
142+
let save = self.pos;
143+
if matches!(self.peek_char(), Some('/')) {
144+
self.advance_char();
145+
match self.peek_char() {
146+
Some('/') => {
147+
self.advance_char();
148+
while let Some(c) = self.peek_char() {
149+
if c == '\n' { break; }
150+
self.advance_char();
151+
}
152+
},
153+
Some('*') => {
154+
self.advance_char();
155+
let mut counter = 1;
156+
let mut last_c = ' ';
157+
while let Some(c) = self.advance_char() {
158+
match (last_c, c) {
159+
('*', '/') => counter -= 1,
160+
('/', '*') => counter += 1,
161+
_ => {},
162+
}
163+
if counter == 0 { break; }
164+
last_c = c;
165+
}
166+
},
167+
_ => self.pos = save
168+
}
169+
}
170+
}
171+
135172
fn lex_number(&mut self, hint: LexHint) -> Token {
136173
let start = self.pos;
137174

@@ -140,8 +177,8 @@ impl Lexer<'_> {
140177
}
141178

142179
if matches!(hint, LexHint::Any) {
180+
let save = self.pos;
143181
if self.peek_char() == Some('.') {
144-
let save = self.pos;
145182
self.advance_char();
146183

147184
if matches!(self.peek_char(), Some(c) if c.is_ascii_digit()) {
@@ -155,8 +192,8 @@ impl Lexer<'_> {
155192
}
156193

157194
if matches!(hint, LexHint::Any) {
195+
let save = self.pos;
158196
if matches!(self.peek_char(), Some('e' | 'E')) {
159-
let save = self.pos;
160197
self.advance_char();
161198

162199
if matches!(self.peek_char(), Some('+' | '-')) {

src/syntax/parser.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
4949
fn parse_program(&mut self) -> ParsedAst<'a> {
5050
let mut stmts = Vec::new();
5151

52+
self.skip_newlines();
5253
while !matches!(self.stream.peek_with(LexHint::Any).map(|t| t.kind), Some(TokenKind::EOF) | None) {
5354
stmts.push(self.parse_statement());
55+
self.skip_newlines();
5456
}
5557

5658
let span = stmts.first()
@@ -69,7 +71,14 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
6971

7072
impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
7173
fn next_token(&mut self) -> Token {
72-
self.stream.next().expect("[Parser] Internal error: Unexpected end of token stream")
74+
let tok = self.stream.next().expect("[Parser] Internal error: Unexpected end of token stream");
75+
if tok.kind == TokenKind::Unknown {
76+
self.diags.emit(
77+
Diagnostic::error("unknown token")
78+
.with_span(tok.span)
79+
);
80+
};
81+
tok
7382
}
7483

7584
fn peek_token(&mut self) -> Token {

0 commit comments

Comments
 (0)