xiiregexbuilder

FPGA-Accelerated Regular Expression Matching Engine
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:
Msrc/lexer.cpp | 34++++++++++++++++++++++++++++++++++
Msrc/lexer.h | 21+++++++++++++++++++++
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(); +