Ejemplo n.º 1
0
 private bool Analyze()
 {
     PrintStackAndInput();
     while (true)
     {
         PrintStackAndInput();
         char stack_symb = PopFromStack();
         if (stack_symb == emptyProduction)
         {
             continue;
         }
         Lexema lexema       = input.peekLexema();
         char   seqence_symb = lexema.symbol;
         if (stack_symb == seqence_symb)
         {
             if (stack_symb == stopSymbol)
             {
                 Console.WriteLine("String is perfect.");
                 return(true);
             }
             else
             {
                 input.get();            //отстранява се следващия символ от потока
             }
         }
         else
         {
             //предполага се, че символа, взет от стека, е нетерминален
             //търсене на нетерм. символ в table_entry
             Hashtable table_entry = (Hashtable)productionsTable[stack_symb];
             if (table_entry != null)
             {
                 //търсене на продукция за замяна на нетерм. символ
                 String production = (String)table_entry[seqence_symb];
                 if (production != null)
                 {
                     //към стека се добавя нужната продукция
                     PushIntoStack(production);
                     PrintProduction(stack_symb, production);
                 }
                 else
                 {
                     //не съществува продукция, за да получим stack_symb => seqence_symb
                     SyntaxError(String.Format("Не съществува продукция {0} => {1}",
                                               stack_symb, seqence_symb), lexema.row);
                     return(false);
                 }
             }
             else
             {
                 //няма такъв нетерминален символ или това е терминален символ,
                 //различен от този във входната редица
                 SyntaxError(String.Format("Символът от стека '{0}' е терминален " +
                                           "и не съвпада със символа от входната редица: '(1)' " +
                                           "или е нетерминален и не образува продукции", stack_symb, seqence_symb), lexema.row);
                 return(false);
             }
         }
     }
 }
Ejemplo n.º 2
0
 private bool changeSymbol(LexemaSequence input, Lexema lexema, char search_symbol,
                           char replace_symbol)
 {
     if (lexema.symbol == search_symbol)
     {
         if (input.GetPosition() > 1)
         {
             if (input.getLexema(input.GetPosition() - 2).symbol == Expression.IDENTIFIER)
             {
                 lexema.symbol = replace_symbol;
                 return(true);
             }
         }
         if (input.GetPosition() < input.size())
         {
             if (input.peekLexema().symbol == Expression.IDENTIFIER)
             {
                 //това е префиксна операция, не се прави заместване
                 return(true);
             }
             else
             {
                 Console.WriteLine(search_symbol + " can be applyed only to identifier.");
                 return(false);
             }
         }
         Console.WriteLine("Error 1002.");
         return(false);
     }
     else
     {
         return(true);
     }
 }