feat(lexer): add multiline comments
This commit is contained in:
7
examples/06_comments.peb
Normal file
7
examples/06_comments.peb
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
let var1 = 3 // A comment
|
||||||
|
let var2 // A second comment *{}
|
||||||
|
12 /*
|
||||||
|
var1 += var2
|
||||||
|
*/ 34
|
||||||
|
|
||||||
|
56 /* // drgdr */ 78
|
||||||
2
main.py
2
main.py
@@ -10,7 +10,7 @@ def main():
|
|||||||
123
|
123
|
||||||
"This is
|
"This is
|
||||||
another string" """
|
another string" """
|
||||||
path: str = "examples/05_loop.peb"
|
path: str = "examples/06_comments.peb"
|
||||||
with open(path, "r") as f:
|
with open(path, "r") as f:
|
||||||
source = f.read()
|
source = f.read()
|
||||||
lexer: Lexer = Lexer()
|
lexer: Lexer = Lexer()
|
||||||
|
|||||||
20
src/lexer.py
20
src/lexer.py
@@ -119,9 +119,9 @@ class Lexer:
|
|||||||
self.add_token(TokenType.LESS_EQUAL if self.match("=") else TokenType.LESS)
|
self.add_token(TokenType.LESS_EQUAL if self.match("=") else TokenType.LESS)
|
||||||
case "/":
|
case "/":
|
||||||
if self.match("/"):
|
if self.match("/"):
|
||||||
while self.peek() != "\n" and not self.is_at_end():
|
self.scan_comment()
|
||||||
self.advance()
|
elif self.match("*"):
|
||||||
self.add_token(TokenType.COMMENT)
|
self.scan_comment_multiline()
|
||||||
else:
|
else:
|
||||||
self.add_token(TokenType.SLASH_EQUAL if self.match("=") else TokenType.SLASH)
|
self.add_token(TokenType.SLASH_EQUAL if self.match("=") else TokenType.SLASH)
|
||||||
case " " | "\r" | "\t" | "\n":
|
case " " | "\r" | "\t" | "\n":
|
||||||
@@ -169,3 +169,17 @@ class Lexer:
|
|||||||
lexeme: str = self.source[self.start:self.idx]
|
lexeme: str = self.source[self.start:self.idx]
|
||||||
token_type: TokenType = KEYWORDS.get(lexeme, TokenType.IDENTIFIER)
|
token_type: TokenType = KEYWORDS.get(lexeme, TokenType.IDENTIFIER)
|
||||||
self.add_token(token_type)
|
self.add_token(token_type)
|
||||||
|
|
||||||
|
def scan_comment(self):
|
||||||
|
while self.peek() != "\n" and not self.is_at_end():
|
||||||
|
self.advance()
|
||||||
|
self.add_token(TokenType.COMMENT)
|
||||||
|
|
||||||
|
def scan_comment_multiline(self):
|
||||||
|
while not (self.peek() == "*" and self.peek_next() == "/") and not self.is_at_end():
|
||||||
|
self.advance()
|
||||||
|
if not self.is_at_end():
|
||||||
|
self.advance()
|
||||||
|
if not self.is_at_end():
|
||||||
|
self.advance()
|
||||||
|
self.add_token(TokenType.COMMENT)
|
||||||
|
|||||||
Reference in New Issue
Block a user