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); } } } }
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); } }