Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 18:59

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.
Автор Сообщение
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Пт июл 16, 2010 18:09 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
>postfix от mOleg-а переделал на многосимвольные операторы.

;)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 21, 2010 18:27 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Ну вот предлагается на "суд толпы..........."
Вариант заточен под операторы Cи в основном под то что встречается в заголовочных файлах.
Сделан из postfix.fts от mOleg
Здесь лежит все что надо одним архивом http://files.mail.ru/5MI0JU
запускать в последней весии форка mOleg
файл hpostfix.fts
Понимаются знаки чисел или выражений в скобках, операторы могут быть любой длины, есть контроль ошибок,
разбираются выражения вида a+b(c<<d) значение которые предполагается вычислить и положить результат на стек. Выражение с присвоением например а=b+c вызовет ошибку.
А также ошибку вызовут некотрые другие операторы Cи.

Знак изменяется использованием слова NEGATE -так проще всего получилось.
Пример: A*-B преобразуется в A B NEGATE * ; A/-(B-C) преобразуется в A B C - NEGATE /
_________________Итак начинаем пинать :wink: ______________
Код:
\ 19.02.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ преобразование префиксной записи в постфиксную
\ Переработано _Harry

\ <<<<<< _Harry - так в дальнешем обозначаться мои изменения в postfix.fts <<<<<<<

rel/ xxWord.fts  \ Поиск лексем и многосимвольных разделителей
\ string/ xWord.fts

\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


stack/ stack.fts
memory/ box.fts
memory/ buff.fts


VOCABULARY TRANSL
ALSO TRANSL DEFINITIONS
\ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

VARIABLE ListOp \ Адрес списка операторов

ListOp  \ Начнем добавлять в список  операторы
\ Коментарии после AddNode/ только в новой строке
\ так как читается вся строка
AddNode/ ,
AddNode/ ?
AddNode/ ;
AddNode/ =
\ Предыдущие операторы вызовут ошибку поэтому их в самое начало
AddNode/ <
AddNode/ >
AddNode/ |
AddNode/ &
AddNode/ ~
AddNode/ %
AddNode/ (
AddNode/ )
AddNode/ /
AddNode/ *
AddNode/ -
AddNode/ +
\ Самые употребительные ближе к хвосту списка будет быстрее разбор строки
AddNode/ ==
AddNode/ >>
AddNode/ <<
AddNode/ <=
AddNode/ =>
\ Самые длинные операторы в хвост списка чтобы раньше нашлись
\ особенно если есть совпадающие по символам но более короткие
DROP \ Закончили

\ Убрать пробелы перед лексемой
: nospace> ( asc # -- asc # ) OVER + SWAP
           BEGIN DDUP >
           WHILE DUP C@
                 Bl_ =
                 WHILE 1 + REPEAT
           THEN  SWAP OVER - ;

\ Убрать пробелы после лексемы
: <nospace ( asc # -- asc # ) OVER +
           BEGIN DDUP < WHILE
                 1 - DUP C@
                 Bl_ = WHILE REPEAT
                 1 +
           THEN OVER - ;

\ Заменить все символы табуляции в строке на пробелы
: notab ( asc # -- asc # ) DDUP OVER + SWAP
           BEGIN DDUP >
           WHILE DUP C@
                 Tab_ = IF Bl_ OVER C! THEN
                 1 +
           REPEAT DDROP ;

\ Убрать пробелы и знаки табуляции из строки операнда и проверить что операнд один
: operand ( asc # -- asc # ) notab
           nospace>  <nospace
           s"  " SEARCH ABORT" Много операндов!" ;

\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

0xF00 CONSTANT buff#
USER-VALUE OutBuff

\ копировать содержимое строки в выходной буфер
: s>out ( asc # --> )
        OutBuff >Buffer
        IFNOT ERROR" Слишком длинная выходная строка!" THEN ;

\ переместить символ в выходной буфер
: c>out ( char --> ) SP@ 1 s>out DROP ;

\ если строка имеет не нулевую длину добавить ее в выходной буфер
: ~oper ( asc # --> ) *IF s>out Bl_ c>out ;THEN DDROP ;

\ --------------------------------------------------------------------------

0 VALUE oplist \ список операторов

\ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

VARIABLE _)_  \ TRUE если последний разобраный оператор закрывающая скобка


\ Работа с операторами найти по имени оператор и выполнить его
\ укоротить строку источник по границе за оператором
\ a# -длина операнда; asc_s # -строка источник asc_o # -строка оператор
: ?operator ( l: a# d: asc_s # asc_o # -- asc_s # )
            DDUP
            oplist SEARCH-WORDLIST IF EXECUTE
                                   ELSE ERROR" Неверный оператор!"
                                   THEN + \ Адрес с которого продолжим разбор
                                   ROT OVER - ROT + \ Укоротили разбираемую строку
                                   LDROP ;

\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

\ --------------------------------------------------------------------------

USER-VALUE operators \ стек для хранения отложенных операторов
0x20 CONSTANT operators# \ количество ячеек в стеке операторов

\ втолкнуть оператор на стек операторов
: adjourn ( addr --> ) operators PushTo ;

\ вытолкнуть оператор из стека операторов
: stretch ( --> addr ) operators PopFrom ;

\ прочесть верхний оператор в стеке операторов
: topmost ( --> addr ) operators ReadTop ;

\
: any ( --> # ) operators StackDepth ;

\ --------------------------------------------------------------------------

\ вернуть приоритет операции
: priority ( 'op --> pri ) B@ ;
\ добавить имя операции в выходной буфер
: operator ( 'op --> ) *IF 1 + COUNT ~oper ;THEN DROP ;

\ двухместная операция, то есть когда есть операнд слева и справа от операции
: twoseater ( 'op --> )
            >L BEGIN topmost WHILE
                     topmost priority L@ priority < WHILENOT
                     stretch operator
               REPEAT
               THEN
               L> adjourn
               \ <<<<<
               _)_ OFF ; \ >>>>>>

\ открывающая скобка
: LeftBracket ( 'op --> )
              0 adjourn
              twoseater
              \ <<<<<
               _)_ OFF ; \ >>>>>>

: <= ( n --> flag ) > 0 = ;

\ закрывающая скобка
: RigthBracket ( 'op --> )
               >L BEGIN topmost WHILE
                        topmost priority L@ priority <= WHILE
                        stretch operator
                  REPEAT
                  THEN stretch DROP \ удаление нуля
                  L> adjourn
                  \ <<<<<
                  _)_ ON ; \ >>>>>>

VOCABULARY OPERATORS \ словарь, в котором находится список операций

ALSO OPERATORS CONTEXT @ TO oplist
THIS \ отсюда перечисляется список поддерживаемых операций -----------------

\ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

\ s"  " S: ; \ пробелы просто пропускаются
\ Нет пробелы не считаются операторами


: == BOX[ 2 B, s" =" S", ]BOX twoseater ; \ логическое равно соответствует = в форте

: >> BOX[ 4 B, s" RSHIFT" S", ]BOX twoseater ;

: << BOX[ 4 B, s" LSHIFT" S", ]BOX twoseater ;

: <= BOX[ 4 B, s" <=" S", ]BOX twoseater ;

: => BOX[ 4 B, s" =>" S", ]BOX twoseater ;

: + L@ 0 XOR _)_ @ OR IFNOT ;THEN  \ выход если установили что это знак а не оператор
    BOX[ 3 B, s" +" S", ]BOX twoseater ;

: - L@ 0 XOR _)_ @ OR
                   IFNOT BOX[ 6 B, s" NEGATE" S", ]BOX \ если установили что это знак а не оператор
                   ELSE BOX[ 3 B, s" -" S", ]BOX
                   THEN twoseater ;

\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

: * BOX[ 4 B, s" *" S", ]BOX twoseater ;
: / BOX[ 4 B, s" /" S", ]BOX twoseater ;
: % BOX[ 4 B, s" MOD" S", ]BOX twoseater ;

: & BOX[ 5 B, s" AND" S", ]BOX twoseater ; \ AND
: | BOX[ 5 B, s" OR" S", ]BOX twoseater ; \ OR
: ~ BOX[ 5 B, s" XOR" S", ]BOX twoseater ; \ XOR

: > BOX[ 2 B, s" >" S", ]BOX twoseater ; \ XOR
: < BOX[ 2 B, s" <" S", ]BOX twoseater ; \ XOR


: ( BOX[ 7 B, s" " S", ]BOX LeftBracket ; \ открывающая ( скобка
: ) BOX[ 7 B, s" " S", ]BOX RigthBracket ; \ закрывающая ) скобка

\ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

: , ERROR" Макросы не поддерживаются!" ;

: ? ERROR" Условный оператор пока не сделан :( !" ;

: = ERROR" Приравнивание не поддерживается!" ;

: ; ERROR" Разделители недопустимы!" ;

\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DEFINITIONS \ --------------------------------------------------------------

\ инициализировать стеки, необходимые переменные
: init ( --> )
       operators IFNOT operators# NewStack TO operators THEN
       operators ClearStack 0 adjourn
       OutBuff *IF Clean ELSE DROP buff# Buffer TO OutBuff THEN
       _)_ OFF ;

\ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

\ разбор выражения до конца строки
: expression ( asc # --> asc # )
             init
             S>HEAP DUP COUNT

             BEGIN  *WHILE
                    DDUP ListOp SearchOp
                    operand DUP >L ~oper
                    *IF ?operator
                    ELSE LDROP -ROT DDROP \ нет операторов - вся строка уже обработанна
                    THEN
             REPEAT DDROP

             BEGIN any WHILE stretch operator REPEAT

             FREE THROW

             OutBuff Buffer> ;

\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

RECENT ALSO TRANSL

\ взять выражение до конца строки, преобразовать его в постфикс, отобразить
: expr ( / expression --> )
       Cr_ PARSE
       DDUP TYPE ." == "
       expression TYPE ;

\ преобразовать префиксную запись в постфиксную
: >postfix ( asc # --> asc # ) expression ;

PREVIOUS

\ EOF примеры использования ------------------------------------------------

CR expr a+b+c+d
CR expr a+ b+c+d
CR expr a +b+c+d
CR expr a + b+c+d
CR expr (a+b+c)+d
CR expr a+(b+c)+d
CR expr a==b+c*d&e
CR expr a&b*c+d==e
CR expr a+b*(a*(c+d))
CR expr ((a+b*a)+c)*d

.( \n\r\n\rнеплохо было бы скобки контролировать,\n\rа то вот чего >> )
expr ((((a+b)

.( \n\r\n\r-------числа со знаком-------\n\r)

CR expr -B
CR expr A*-B
CR expr A*(-B)
CR expr A*+B
CR expr (A        <<-    B) +C
CR expr A>>-B +( C*- D)
CR expr (A<<B)-V+( C*- D)
CR expr (a -+ b* - c)/d*-f<k


Последний раз редактировалось _Harry Ср июл 28, 2010 09:57, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 21, 2010 19:16 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
Выражение с присвоением например а=b+c вызовет ошибку.

а какая проблема с присвоением?

_Harry писал(а):
Знак изменяется использованием слова NEGATE -так проще всего получилось.Пример: A*-B преобразуется в A B NEGATE * ;

Опять же, почему не запись a*(-b) выбрана, или в хидерах так не принято?
а вобщем решение очевидное, т.к. В, если не является числом отрицательное значение нужно вычислять, причем, если в случае +(-B) еще можно оставить только вычитание, как операцию, то для умножения и деления вариантов других и нет.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 21, 2010 19:32 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
сразу наткнулся на:
-B == B -
как бы надо это отлавливать, я так понимаю, или в данном случае не важно?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 21, 2010 20:24 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
выцеплять подряд идущие символы умножения\сложения\.. можно так
string/ parser.fts
string/ xWord.fts

s" /%^+-* &|~ <=> :; " Delimiter: separators

\ выделить из входного потока подряд идущие символы разделители
: symbols ( / str --> asc # )
CharAddr >L
BEGIN GetChar WHILE
separators + B@ WHILE
SkipChar
REPEAT DUP
THEN DROP
L@ CharAddr L> - ;

хотя это и не совсем то, что нужно.
имхо, все же лучше просто анализировать следующий символ(ы)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 21, 2010 21:31 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
сразу наткнулся на:
-B == B -
как бы надо это отлавливать, я так понимаю, или в данном случае не важно?

Это как раз ошибка я ее заметил почти сразу но уменя кто то IP c работы заблокировал.
Поправить не смог сразу. Надо в init добавить строку
Код:
_)_ OFF

Иначе если предыдущая строка заканчивалась скобкой то первый минус в NEGATE не превратится.

P.S. Уже поправил :!:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Ср июл 21, 2010 21:48 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
Опять же, почему не запись a*(-b) выбрана, или в хидерах так не принято?

Дело не в том как у кого принято, а как более логично. Плюс и минус всегда считаются знаками если не стоят между двумя операндами, или выражениями заключенными в скобки или ...
Вобщем обычная знакомая со школы логика. Возможно что некоторые комбинации которые обработает мой вариант вызовут у какого нибудь компилятора шок. Но это не страшно так как я прицеливаюсь на уже рабочие файлы.
А твой пример a*(-b) тоже нормально сработает можешь сам убедится :wink:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Чт июл 22, 2010 01:45 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
Выражение с присвоением например а=b+c вызовет ошибку.

А потому что мне это не надо, меня интересуют в основном выражения определяющие константы. А тут надо еще понять чего и как и кому присваивать. Если такое где то встретится в хидерах то лучше пусть ошибка вылезет. А там уж можно самому разобраться как поступить.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Чт июл 22, 2010 15:37 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
_Harry писал(а):
Дело не в том как у кого принято, а как более логично. Плюс и минус всегда считаются знаками если не стоят между двумя операндами, или выражениями заключенными в скобки или ...

так если речь идет о Си, то ведь -- ++ никуда не деваются, не так ли?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Чт июл 22, 2010 15:50 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
так если речь идет о Си, то ведь -- ++ никуда не деваются, не так ли?

Согласен только где ты их встречал в константных выражениях?
Я ж писал что этот постфих под определенное применение заточен. Таже история что и с = .
В общем можно наверно ++ внести в операторы генерящие ошибки.
Вообще я думаю маленько поэксплотировать а там посмотрим что доработать нужно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Пт июл 23, 2010 10:59 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg Опять какие то косяки с EVALUATE
СМОТРИ:
Код:
FORTH(0)>: ti1 s" 1 2 +" EVALUATE [COMPILE] LITERAL ; IMMEDIATE
Ok
FORTH(0)>ti1
Ok
FORTH(1)>.
3  Ok
FORTH(0)>: t2 ti1 3 - ;

Ошибка: Незавершенное определение в конце исходного текста!

FORTH(0)>


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Пт июл 23, 2010 12:39 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Вообще я думаю маленько поэксплотировать а там посмотрим что доработать нужно.
vyt кажется что лучше поискать сразу универсальное решение


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Пт июл 23, 2010 12:46 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
вопрос писал(а):
универсальное решение

Что имеется в виду :?:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Пт июл 23, 2010 13:14 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
_Harry писал(а):
вопрос писал(а):
универсальное решение

Что имеется в виду :?:
решение, учитывающее синтаксис языка весь


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование скобочной записи в постфикс
СообщениеДобавлено: Пт июл 23, 2010 13:15 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
_Harry писал(а):
вопрос писал(а):
универсальное решение

Что имеется в виду :?:


Очевидно, cinf от Михаила Максимова :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 148 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB