public static Template Parse() { StackElement st = new StackElement(); st.state = 0; stack.Push(st); char lookahead; int intVal; invokeLexer(out lookahead, out intVal); while (stack.Peek().state != 1 || lookahead != '$') { processOneStep(lookahead, intVal); invokeLexer(out lookahead, out intVal); } Template ret = stack.Peek().tempVal; stack.Peek().tempVal = null; return(ret); }
public static void processOneStep(char lookahead, int intVal) { Debug.Assert(stack.Count() > 0); StackElement topElement = stack.Peek(); Dictionary<char, int> tableRow; if(shift.TryGetValue(topElement.state, out tableRow)) { int tableValue; if(tableRow.TryGetValue(lookahead, out tableValue)) { if(lookahead == 'i') { StackElement st = new StackElement(intVal); st.state = tableValue; stack.Push(st); // remove the integer at the beginning of the string str Debug.Assert(str.ElementAt(0) <= '9' && str.ElementAt(0) >= '0'); int pos = str.IndexOfAny("();,".ToCharArray(), 0); if (pos > -1) { str = str.Substring(pos); } else { str = str.Substring(str.Length); } } else { StackElement st = new StackElement(lookahead); st.state = tableValue; stack.Push(st); str = str.Substring(1); } return; } // else case Console.WriteLine("Error encountered while parsing the template!"); Console.WriteLine("Shift rule not defined for lookahead char {0} in state {1}", lookahead, topElement.state); Debug.Assert(false); } // reduce operation if (reduce.TryGetValue(topElement.state, out tableRow)) { int tableValue; if (tableRow.TryGetValue(lookahead, out tableValue)) { switch (tableValue) { // which reduce rule do we have to apply? case 1: { StackElement rightBracket = stack.Pop(); Debug.Assert(rightBracket.t == StackElementType.charType); Debug.Assert(rightBracket.charVal == ')'); StackElement template = stack.Pop(); Debug.Assert(template.t == StackElementType.templateType); StackElement leftBracket = stack.Pop(); Debug.Assert(leftBracket.t == StackElementType.charType); Debug.Assert(leftBracket.charVal == '('); int newState = goto_actions[stack.Peek().state]['t']; StackElement st = new StackElement(template.tempVal); st.state = newState; template.tempVal = null; stack.Push(st); break; } case 2: { StackElement rightTemp = stack.Pop(); Debug.Assert(rightTemp.t == StackElementType.templateType); StackElement semi_colon = stack.Pop(); Debug.Assert(semi_colon.t == StackElementType.charType); Debug.Assert(semi_colon.charVal == ';'); StackElement leftTemp = stack.Pop(); Debug.Assert(leftTemp.t == StackElementType.templateType); StackElement st = new StackElement(new Template(TemplateOperator.DisjunctionOp, leftTemp.tempVal, rightTemp.tempVal)); int newState = goto_actions[stack.Peek().state]['t']; st.state = newState; leftTemp.tempVal = null; rightTemp.tempVal = null; stack.Push(st); break; } case 3: { StackElement rightTemp = stack.Pop(); Debug.Assert(rightTemp.t == StackElementType.templateType); StackElement comma = stack.Pop(); Debug.Assert(comma.t == StackElementType.charType); Debug.Assert(comma.charVal == ','); StackElement leftTemp = stack.Pop(); Debug.Assert(leftTemp.t == StackElementType.templateType); StackElement st = new StackElement(new Template(TemplateOperator.ConjunctionOp, leftTemp.tempVal, rightTemp.tempVal)); int newState = goto_actions[stack.Peek().state]['t']; st.state = newState; leftTemp.tempVal = null; rightTemp.tempVal = null; stack.Push(st); break; } case 4: { StackElement intElement = stack.Pop(); Debug.Assert(intElement.t == StackElementType.intType); int newstate = goto_actions[stack.Peek().state]['t']; StackElement st = new StackElement(new Template(intElement.intVal)); st.state = newstate; stack.Push(st); break; } default: Console.WriteLine("Error encountered while parsing the template!"); Console.WriteLine("Unknown reduction rule sought."); Debug.Assert(false); break; } return; } else { Console.WriteLine("Error encountered while parsing the template!"); Console.WriteLine("reduce rule not defined for lookahead char {0} in state {1}", lookahead, topElement.state); Debug.Assert(false); } } else { Console.WriteLine("Error encountered while parsing template!"); Console.WriteLine("No entry in ParserTable corresponding to the current state {0} on top of the stack.", topElement.state); Debug.Assert(false); } return; }
public static void processOneStep(char lookahead, int intVal) { Debug.Assert(stack.Count() > 0); StackElement topElement = stack.Peek(); Dictionary <char, int> tableRow; if (shift.TryGetValue(topElement.state, out tableRow)) { int tableValue; if (tableRow.TryGetValue(lookahead, out tableValue)) { if (lookahead == 'i') { StackElement st = new StackElement(intVal); st.state = tableValue; stack.Push(st); // remove the integer at the beginning of the string str Debug.Assert(str.ElementAt(0) <= '9' && str.ElementAt(0) >= '0'); int pos = str.IndexOfAny("();,".ToCharArray(), 0); if (pos > -1) { str = str.Substring(pos); } else { str = str.Substring(str.Length); } } else { StackElement st = new StackElement(lookahead); st.state = tableValue; stack.Push(st); str = str.Substring(1); } return; } // else case Console.WriteLine("Error encountered while parsing the template!"); Console.WriteLine("Shift rule not defined for lookahead char {0} in state {1}", lookahead, topElement.state); Debug.Assert(false); } // reduce operation if (reduce.TryGetValue(topElement.state, out tableRow)) { int tableValue; if (tableRow.TryGetValue(lookahead, out tableValue)) { switch (tableValue) { // which reduce rule do we have to apply? case 1: { StackElement rightBracket = stack.Pop(); Debug.Assert(rightBracket.t == StackElementType.charType); Debug.Assert(rightBracket.charVal == ')'); StackElement template = stack.Pop(); Debug.Assert(template.t == StackElementType.templateType); StackElement leftBracket = stack.Pop(); Debug.Assert(leftBracket.t == StackElementType.charType); Debug.Assert(leftBracket.charVal == '('); int newState = goto_actions[stack.Peek().state]['t']; StackElement st = new StackElement(template.tempVal); st.state = newState; template.tempVal = null; stack.Push(st); break; } case 2: { StackElement rightTemp = stack.Pop(); Debug.Assert(rightTemp.t == StackElementType.templateType); StackElement semi_colon = stack.Pop(); Debug.Assert(semi_colon.t == StackElementType.charType); Debug.Assert(semi_colon.charVal == ';'); StackElement leftTemp = stack.Pop(); Debug.Assert(leftTemp.t == StackElementType.templateType); StackElement st = new StackElement(new Template(TemplateOperator.DisjunctionOp, leftTemp.tempVal, rightTemp.tempVal)); int newState = goto_actions[stack.Peek().state]['t']; st.state = newState; leftTemp.tempVal = null; rightTemp.tempVal = null; stack.Push(st); break; } case 3: { StackElement rightTemp = stack.Pop(); Debug.Assert(rightTemp.t == StackElementType.templateType); StackElement comma = stack.Pop(); Debug.Assert(comma.t == StackElementType.charType); Debug.Assert(comma.charVal == ','); StackElement leftTemp = stack.Pop(); Debug.Assert(leftTemp.t == StackElementType.templateType); StackElement st = new StackElement(new Template(TemplateOperator.ConjunctionOp, leftTemp.tempVal, rightTemp.tempVal)); int newState = goto_actions[stack.Peek().state]['t']; st.state = newState; leftTemp.tempVal = null; rightTemp.tempVal = null; stack.Push(st); break; } case 4: { StackElement intElement = stack.Pop(); Debug.Assert(intElement.t == StackElementType.intType); int newstate = goto_actions[stack.Peek().state]['t']; StackElement st = new StackElement(new Template(intElement.intVal)); st.state = newstate; stack.Push(st); break; } default: Console.WriteLine("Error encountered while parsing the template!"); Console.WriteLine("Unknown reduction rule sought."); Debug.Assert(false); break; } return; } else { Console.WriteLine("Error encountered while parsing the template!"); Console.WriteLine("reduce rule not defined for lookahead char {0} in state {1}", lookahead, topElement.state); Debug.Assert(false); } } else { Console.WriteLine("Error encountered while parsing template!"); Console.WriteLine("No entry in ParserTable corresponding to the current state {0} on top of the stack.", topElement.state); Debug.Assert(false); } return; }
public static Template Parse() { StackElement st = new StackElement(); st.state = 0; stack.Push(st); char lookahead; int intVal; invokeLexer(out lookahead, out intVal); while(stack.Peek().state != 1 || lookahead != '$') { processOneStep(lookahead, intVal); invokeLexer(out lookahead, out intVal); } Template ret = stack.Peek().tempVal; stack.Peek().tempVal = null; return ret; }