using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
static void Main(string[] args)
List<Tokenizer.Token> tokenList;
while (response != "exit")
Console.WriteLine("Enter the Code");
var code = Console.ReadLine();
tokenList = Tokenizer.Tokenize(code);
if (Parser.Parse(tokenList))
Console.WriteLine("Valid Statement");
Console.WriteLine("Invalid Statement");
Console.WriteLine("Enter [exit] to close the Program or...");
Console.WriteLine("enter anything else to continue");
response = Console.ReadLine();
Console.WriteLine("Invalid Input");
public static List<Token> tokenList = new List<Token>();
public Token(String value, TokenType type)
static HashSet<string> dataTypes = new HashSet<string>() {"var", "byte", "short", "int", "long",
"float", "double", "boolean", "char"};
static readonly Regex varRegex = new(@"^\w+$");
public static List<Token> Tokenize(string input)
char[] delimiters = { ' ', '(', ')', '/', '*', '+', '-' };
String[] inputList = input.Split(delimiters);
foreach (String inp in inputList)
tokenList.Add(new Token(inp, GetTokenType(inp)));
static TokenType GetTokenType(String value)
return TokenType.ADDITION_OPERATOR;
else if (value.Equals('-'))
return TokenType.SUBTRACTION_OPERATOR;
else if (value.Equals('*'))
return TokenType.MULTIPLICATION_OPERATOR;
else if (value.Equals('/'))
return TokenType.DIVISION_OPERATOR;
else if (int.TryParse(value, out _))
return TokenType.NUMERIC_LITERAL;
else if (dataTypes.Contains(value))
return TokenType.DATATYPE;
else if (varRegex.IsMatch(value))
return TokenType.IDENTIFIER;
return TokenType.UNKNOWN;
static int currentTokenIndex = 0;
static Tokenizer.Token? currentToken;
static List<Tokenizer.Token>? _tokenList;
static bool isValid = false;
static bool isDeclaration = false;
static bool isInitialization = false;
public static bool Parse(List<Tokenizer.Token> tokenList)
currentToken = tokenList[currentTokenIndex];
if (isDeclaration || isInitialization)
static bool match(string expectedValue)
if (currentToken?.value == expectedValue)
static bool match(Tokenizer.TokenType expectedType)
if (currentToken?.type == expectedType)
if (currentTokenIndex < _tokenList?.Count)
currentToken = _tokenList[currentTokenIndex];
static bool ParseStatement()
if (ParseInitialization())
static bool ParseDeclaration()
if (match(Tokenizer.TokenType.DATATYPE) && match(Tokenizer.TokenType.IDENTIFIER))
static bool ParseInitialization()
if (ParseDeclaration() && match("=") && ParseExpression())
static bool ParseExpression()
while (currentToken?.value != ";")