Ejemplo n.º 1
0
 private void PreAnalyze()
 {
     //в стека се слага символа за дъно и стартовия нетерминален символ на граматиката
     ClearStack();
     PushIntoStack(stopSymbol);
     PushIntoStack(startSymbol);
     //към входната редица се добавя символа за край (това не е ';')
     input.Add(stopSymbol);
 }
Ejemplo n.º 2
0
        private void ParseString(String strInput, int line_number)
        {
            while (strInput.Length > 0)
            {
                Match identifier = Regex.Match(strInput, @"^[_A-Za-z][_A-Za-z0-9]*");
                if (identifier.Success)
                {
                    strInput = strInput.Remove(0, identifier.Value.Length);
                    if (identifier.Value.Equals("printf"))
                    {
                        lexSeq.Add(Expression.PRINTF, line_number, Lexema.NO_ADDRESS, Lexema.NO_VALUE);
                    }
                    else if (identifier.Value.Equals("scanf"))
                    {
                        lexSeq.Add(Expression.SCANF, line_number, Lexema.NO_ADDRESS, Lexema.NO_VALUE);
                    }
                    else //значи е променлива
                    {
                        lexSeq.Add(Expression.IDENTIFIER, line_number, descTable.Register(identifier.Value), Lexema.NO_VALUE);
                    }
                }
                else
                {
                    Match num = Regex.Match(strInput, @"^[0-9]+");
                    if (num.Success)
                    {
                        strInput = strInput.Remove(0, num.Value.Length);
                        lexSeq.Add(Expression.NUMBER, line_number, Lexema.NO_ADDRESS, Int32.Parse(num.Value));
                    }

                    else
                    {
                        Match delimiter = Regex.Match(strInput, @"^\s+");
                        if (delimiter.Success)
                        {
                            strInput = strInput.Remove(0, delimiter.Value.Length);
                        }
                        else
                        {
                            Match incr = Regex.Match(strInput, @"^\+\+");
                            if (incr.Success)
                            {
                                strInput = strInput.Remove(0, incr.Value.Length);
                                lexSeq.Add(Expression.PREFIX_INCREMENT, line_number, Lexema.NO_ADDRESS, Lexema.NO_VALUE);
                            }
                            else
                            {
                                Match decr = Regex.Match(strInput, @"^\-\-");
                                if (decr.Success)
                                {
                                    strInput = strInput.Remove(0, decr.Value.Length);
                                    lexSeq.Add(Expression.PREFIX_DECREMENT, line_number, Lexema.NO_ADDRESS, Lexema.NO_VALUE);
                                }
                                else
                                {
                                    Match operation = Regex.Match(strInput, @"^[=\|\+\-\*\/%~();&!]");
                                    if (operation.Success)
                                    {
                                        strInput = strInput.Remove(0, operation.Value.Length);
                                        lexSeq.Add(operation.Value[0], line_number, Lexema.NO_ADDRESS, Lexema.NO_VALUE);
                                    }
                                    else
                                    {
                                        Console.WriteLine("Error");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }