using System.Collections.Generic;
static Stack<string> TokenStack;
static List<string> InputBuffer;
static Stack<string> ActionStack = new Stack<string>();
public static void Main()
Console.WriteLine("\n\nEnter Expression");
List<string> InputBuffer = Lexer(Console.ReadLine());
Stack<string> TokenStack = new Stack<string>();
for(int i = InputBuffer.Count-1; i >= 0; i--) {
TokenStack.Push(InputBuffer[i]);
while(TokenStack.Count > 0) {
Console.WriteLine("\nPress any key to exit.");
public static List<string> Lexer(string input)
SortedList<string, string> LookupTable = new SortedList<string, string>();
LookupTable.Add("+","+");
LookupTable.Add("-","-");
LookupTable.Add("=","=");
LookupTable.Add("*","*");
LookupTable.Add("/","/");
LookupTable.Add("(","(");
LookupTable.Add(")",")");
char[] CharacterStream = input.ToCharArray();
InputBuffer = new List<string>();
while(j < CharacterStream.Length && j < CharacterStream.Length)
string CurChar = Char.ToString(CharacterStream[j]);
if(Char.IsLetter(CharacterStream[j]) || Char.IsDigit(CharacterStream[j]))
while(j < CharacterStream.Length-1 && (Char.IsDigit(CharacterStream[j+1]) || Char.IsLetter(CharacterStream[j+1])))
Lexeme += CharacterStream[j];
Console.WriteLine(Lexeme+":"+InputBuffer[i]);
else if(LookupTable.ContainsKey(CurChar))
InputBuffer.Add(LookupTable[CurChar]);
Console.WriteLine(CurChar+":"+LookupTable[CurChar]);
Console.WriteLine("Error: Character "+CurChar+" not recognized.");
if(InputBuffer != null) InputBuffer.Add("EOF");
private static void E() {
private static void T() {
private static void F() {
private static void Error() {
private static void Shift(int NewState) {
NextToken = TokenStack.Pop();
ActionStack.Push(NextToken);
private static void NextStep() {
NextToken = TokenStack.Peek();
if(State == 0 || State == 4 || State == 6 || State == 7) Shift(5);
private static void Reduce(int Rule) {