Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2012, 19:42   #1
phreaker228
Пользователь
 
Регистрация: 31.05.2011
Сообщений: 18
По умолчанию Перевод в постфиксную систему

Пишу программу для перевода из инфиксной системы в постфиксную, при работе программы выдает ошибку EAccessviolation, и указывает на Stack. Помогите исправить ошибку,замучался уже

Код:
procedure TForm1.PostFix(s: string; var stack: Tstringlist);
var
Temp:TstringList;
Ms: TMemoryStream;  
begin
Temp:=TStringList.Create;   // создаем вирт. список
Ms:=TMemoryStream.Create;
Ms.WriteBuffer( s[1], Length( s ) ); 
Ms.Position := 0;
with TParser.Create( Ms ) do  // создаем парсер памяти
       begin
   while Token <>toEof do                //  пока токены не кончились
   begin
   if (TokenString[1] in ['0'..'9'] ) then    // если токен - число
   begin
   Stack[Stack.Count-1] := Stack[Stack.Count-1] + TokenString; // помещаем токен в стек !!!!ЗДЕСЬ ОШИБКУ ВЫДАЁТ!!!
   end
        else
        Stack.Add(TokenString);   // добавляем токен в конец стека
 //если токен символ
         if ( TokenString[1] in ['+','-','/','*'] ) then
         begin
            // если стек пустой,то помещаем знак в стек
            if Temp.Count = 0 then
               Temp.Add( TokenString )
            else
            begin
               // если приоритет текущей операции выше,чем предыдущей,то помещаем знак в стек
              
               if GetPriority( TokenString[1] ) > GetPriority( Temp.Strings[Temp.Count-1][1] ) then
                  Temp.Add( TokenString )
               else
               begin
                  // иначе извлекаем из стека,пока не встретим операцию с более высоким приоритетом
                  while true do
                  begin
                     Stack.Add( Temp.Strings[Temp.Count-1] );
                     Temp.Delete( Temp.Count-1 );
                     if Temp.Count = 0 then Break;
                     if GetPriority( TokenString[1] ) > GetPriority( Temp.Strings[Temp.Count-1][1] ) then
                        Break;
                  end;
                  // добавляем в стек текущую операцию
                  Temp.Add( TokenString );
               end;
            end;
         end;
        
         if ( TokenString[1] in ['('] ) then
            Temp.Add( TokenString );
       
         if ( TokenString[1] in [')'] ) then
         while true do
         begin
            if Temp.Count = 0 then Break;
            if Temp.Strings[Temp.Count-1] = '(' then
            begin
               Temp.Delete( Temp.Count-1 );
               Break;
            end;
            Stack.Add( Temp.Strings[Temp.Count-1] );
            Temp.Delete( Temp.Count-1 );
         end;
         NextToken;
      end;
   end;
   Ms.Free;
   // если по окончанию работы с формулой в стеке что-то осталось,то извлекаем все в выходной стек
   if Temp.Count <> 0 then
      while Temp.Count <> 0 do
      begin
         Stack.Add( Temp.Strings[Temp.Count-1] );
         Temp.Delete( Temp.Count-1 );
      end;
   Temp.Free;
end;
phreaker228 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из префиксной в постфиксную Стариков Константи Помощь студентам 0 22.10.2012 12:43
Перевод выражения из инфиксной в постфиксную форму branbranzor Помощь студентам 1 18.06.2012 00:04
Перевод в постфиксную форму в общем случае. Lasur Помощь студентам 1 17.03.2012 09:16
Перевод в постфиксную форму записи. tgig Помощь студентам 1 08.06.2010 12:01
Выражение в постфиксную форму перевод Toni Milano Помощь студентам 2 01.12.2009 10:57