commit 71535acc3c401f82ef63d68900a5930a2d7df7ea
parent 536594803c76145b84c19d51bc4362546e9a7bba
Author: Pranav Prabhu Kumble <kumblepranavprabhu@gmail.com>
Date: Sat, 28 Mar 2026 17:23:04 +0530
Week 2: Implement Lexer (Part 2: Core logic)
Diffstat:
2 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/src/lexer.cpp b/src/lexer.cpp
@@ -24,3 +24,37 @@ char Lexer::peek() const {
return input[pos];
}
+char Lexer::advance() {
+ char current = input[pos++];
+ col++;
+ return current;
+}
+
+bool Lexer::isAtEnd() const {
+ return pos >= input.length();
+}
+
+std::vector<Token> Lexer::tokenize() {
+ std::vector<Token> tokens;
+
+ while (!isAtEnd()) {
+ char c = peek();
+ int currentCharCol = col;
+
+ switch (c) {
+ case '.':
+ tokens.emplace_back(TokenType::DOT, advance(), line, currentCharCol);
+ break;
+ case '*':
+ tokens.emplace_back(TokenType::STAR, advance(), line, currentCharCol);
+ break;
+ case '+':
+ tokens.emplace_back(TokenType::PLUS, advance(), line, currentCharCol);
+ break;
+ case '?':
+ tokens.emplace_back(TokenType::QUESTION, advance(), line, currentCharCol);
+ break;
+ case '|':
+ tokens.emplace_back(TokenType::PIPE, advance(), line, currentCharCol);
+ break;
+ case '(':
diff --git a/src/lexer.h b/src/lexer.h
@@ -13,3 +13,24 @@ enum class TokenType {
QUESTION,
PIPE,
LPAREN,
+ RPAREN,
+ END_OF_INPUT
+};
+
+struct Token {
+ TokenType type;
+ char value; // Meaningful for LITERAL, otherwise ignored or holds the char representation
+ int line; // Useful for error reporting
+ int column; // Useful for error reporting
+
+ Token(TokenType t, char v = 0, int l = 0, int c = 0)
+ : type(t), value(v), line(l), column(c) {}
+};
+
+std::string tokenTypeToString(TokenType type);
+
+class Lexer {
+public:
+ explicit Lexer(const std::string& input, int lineNum = 0);
+ std::vector<Token> tokenize();
+