commit cb0d9aba0f8b2d5d8f2a43d17c2eb32c51ef9fa3
parent bf711fbd4dcf55b2101e316cafd3ef55f89adfb2
Author: Pranav Prabhu Kumble <kumblepranavprabhu@gmail.com>
Date: Mon, 30 Mar 2026 06:18:27 +0530
Week 2: Implement Lexer (Part 3: Finalizing)
Diffstat:
2 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/src/lexer.cpp b/src/lexer.cpp
@@ -58,3 +58,22 @@ std::vector<Token> Lexer::tokenize() {
tokens.emplace_back(TokenType::PIPE, advance(), line, currentCharCol);
break;
case '(':
+ tokens.emplace_back(TokenType::LPAREN, advance(), line, currentCharCol);
+ break;
+ case ')':
+ tokens.emplace_back(TokenType::RPAREN, advance(), line, currentCharCol);
+ break;
+ default:
+ if (c >= 32 && c <= 126) {
+ tokens.emplace_back(TokenType::LITERAL, advance(), line, currentCharCol);
+ } else {
+ throw std::runtime_error("Invalid character at line " + std::to_string(line) +
+ ", column " + std::to_string(currentCharCol) + ": code " + std::to_string(static_cast<unsigned char>(c)));
+ }
+ break;
+ }
+ }
+
+ tokens.emplace_back(TokenType::END_OF_INPUT, '\0', line, col);
+ return tokens;
+}
diff --git a/src/lexer.h b/src/lexer.h
@@ -34,3 +34,15 @@ public:
explicit Lexer(const std::string& input, int lineNum = 0);
std::vector<Token> tokenize();
+private:
+ std::string input;
+ size_t pos;
+ int line;
+ int col;
+
+ char peek() const;
+ char advance();
+ bool isAtEnd() const;
+};
+
+#endif // LEXER_H