Exemple #1
0
        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);
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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;
        }
Exemple #4
0
 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;
 }