Реализация конечного автомата.
От: xobotik Россия  
Дата: 15.08.10 20:49
Оценка:
Доброй ночи!

Задача реализовать конечный автомат, так чтобы весь текст между такими скобками "(* текст *)" и сами скобки включительно заменялись на пробел, т.е. " ".
Реализация:
        public static string RemoveComments(this IEnumerable<char> elements)
        {
            int state = 0x0;
            StringBuilder sb = new StringBuilder(elements.Count());
            foreach (char element in elements)
            {
                switch (state)
                {
                    case 0x0:
                        if (element == '(')
                        {
                            state = 0x1;
                        }
                        else
                        {
                            state = 0x0;
                            sb.Append(element);
                        }
                        break;
                    case 0x1:
                        if (element == '*')
                        {
                            state = 0x2;
                        }
                        else
                        {
                            state = 0x0;
                            sb.Append('(');
                            sb.Append(element);
                        }
                        break;
                    case 0x2:
                        if (element == '*')
                        {
                            state = 0x3;
                        }
                        else
                        {
                            state = 0x2;
                        }
                        break;
                    case 0x3:
                        if (element == ')')
                        {
                            state = 0x0;
                            sb.Append(' ');
                        }
                        else
                        {
                            state = 0x3;
                        }
                        break;
                    default:
                        break;
                }
            }
            return sb.ToString();
        }

На вход подаю "(*)" метод ничего не возвращает, а должен по идеи оставить входные данные без изменения. Вопрос где ошибка?
Во всех остальных случаях, вроде как работает правильно.

Заранее спасибо
С уважением!
Re: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.08.10 21:18
Оценка: 7 (1)
Здравствуйте, xobotik, Вы писали:

X>На вход подаю "(*)" метод ничего не возвращает, а должен по идеи оставить входные данные без изменения. Вопрос где ошибка?

X>Во всех остальных случаях, вроде как работает правильно.


А у тебя что, отладчик отвалился ?

case 0x2:
if (element == '*')
                        {
                            state = 0x3;
                        }
                        else
                        {
                            state = 0x2;
                        }


Очевидно, в состояние 3 перехода не будет и автомат остаётся во 2м состоянии.

( -> 1
* -> 2
) -> 2

Но вообще не ясно условие задачи и код вообще говоря похож на какую то фигню.

что должно быть например в таких случаях
(*
(*(**)
(*ааа
Re[2]: Реализация конечного автомата.
От: xobotik Россия  
Дата: 15.08.10 21:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, xobotik, Вы писали:


X>>На вход подаю "(*)" метод ничего не возвращает, а должен по идеи оставить входные данные без изменения. Вопрос где ошибка?

X>>Во всех остальных случаях, вроде как работает правильно.


I>А у тебя что, отладчик отвалился ?


Нет.

I>
I>case 0x2:
I>if (element == '*')
I>                        {
I>                            state = 0x3;
I>                        }
I>                        else
I>                        {
I>                            state = 0x2;
I>                        }
I>


I>Очевидно, в состояние 3 перехода не будет и автомат остаётся во 2м состоянии.


I>( -> 1

I>* -> 2
I>) -> 2


Ну вообще-то он не останется. Мы ждем в строке еще одну вторую звездочку перебирая элементы. Как только нашли звезду переходим в третье состояние.

I>Но вообще не ясно условие задачи и код вообще говоря похож на какую то фигню.


Спасибо.

I>что должно быть например в таких случаях

I>(*
I>(*(**)
I>(*ааа

(* по идеи везде.

Значит получается нужно заводить какую-либо переменную для накопления результатов после каждого состояния?
С уважением!
Re[2]: Реализация конечного автомата.
От: xobotik Россия  
Дата: 15.08.10 21:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Наверно по другому сформулирую. Надо ли учитывать в этом автомате отсутствие закрывающей скобки вида "*)" или открывающей "(*"?
С уважением!
Re: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.08.10 22:03
Оценка: 4 (1)
Здравствуйте, xobotik, Вы писали:

X>Задача реализовать конечный автомат, так чтобы весь текст между такими скобками "(* текст *)" и сами скобки включительно заменялись на пробел, т.е. " ".

X>Реализация:
X>
X>        public static string RemoveComments(this IEnumerable<char> elements)
X>        {
X>        }
X>


X>Заранее спасибо


Конечный автомат не пойдет, нужен операционный

Вот описание автомата, который замещает конструкцию "(*любые символы кол.вом больше нуля*)" на пробел

примерно так:
(* даст на выходе (*
(*что нибудь даст на выходе (*что нибудь
(*) даст (*)
(**) даст пробел
(*что нибудь*) даст что нибудь

итого

вход автомата

a — любой символ
е — конец строки
(
)
*

состояние автомата
0 начальное состояние/конечное состояние
1 пришла ( ожидается *
2 пришла (* ожидается *
3 пришла (** ожидается )

память
i — индекс элемента начиная с которого подавлялся вывод символов
неявно присутствует номер текущей позиции

выход

pi — печать все символы начиная с i и последнего
pc — печатать текущий
ps — печатать пробел
ri — запомнить текущую позицию в i
пусто — пусто

переходы из состояния 0

на входе ( на выходе ri переход в 1
на входе a,*,),e на выходе pc переход в 0

переходы из состояния 1

на входе * на выходе пусто переход в 2
на входе (,),a,e на выходе pi переход в 0

переходы из состояния 2

на входе * на выходе пусто переход в 3
на входе ),(,a на выхде пусто переход в 2
на входе e на выходе pi переход в 0

переходы из состояния 3

на входе ) на выходе ps переход в 0
на входе * на выходе пусто переход в 3
на входе e на выходе pi переход в 0
на входе (,a на выходе пусто переход в 2
Re[3]: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.08.10 22:06
Оценка:
Здравствуйте, xobotik, Вы писали:

I>>Очевидно, в состояние 3 перехода не будет и автомат остаётся во 2м состоянии.


I>>( -> 1

I>>* -> 2
I>>) -> 2


X>Ну вообще-то он не останется. Мы ждем в строке еще одну вторую звездочку перебирая элементы. Как только нашли звезду переходим в третье состояние.


для варианта (*) автомат остаётся во втором состоянии.

X>Значит получается нужно заводить какую-либо переменную для накопления результатов после каждого состояния?


Да, я поработал немного за тебя, ибо скучно, даже Expendables не помогли Смотри в этом же треде
Re[2]: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.08.10 22:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>примерно так:

I>(* даст на выходе (*
I>(*что нибудь даст на выходе (*что нибудь
I>(*) даст (*)
I>(**) даст пробел
I>(*что нибудь*) даст пробел


Исправленому верить
Re[3]: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.08.10 22:11
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Наверно по другому сформулирую. Надо ли учитывать в этом автомате отсутствие закрывающей скобки вида "*)" или открывающей "(*"?


Это ж от задачи зависит

Может тебе вообще нужно подавлять ажно такое (* (* (* *) *) *)

В этом случае автомат, который я привел, не годится в прынцыпе ибо нужно средство бОлее мощное.
Re[4]: Реализация конечного автомата.
От: xobotik Россия  
Дата: 16.08.10 01:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, xobotik, Вы писали:


X>>Наверно по другому сформулирую. Надо ли учитывать в этом автомате отсутствие закрывающей скобки вида "*)" или открывающей "(*"?


I>Это ж от задачи зависит


Задача заменять что-то типа этого: (* текст *) на пробел.

I>Может тебе вообще нужно подавлять ажно такое (* (* (* *) *) *)


Такого не надо =)

I>В этом случае автомат, который я привел, не годится в прынцыпе ибо нужно средство бОлее мощное.


Ага=)
С уважением!
Re[2]: Реализация конечного автомата.
От: xobotik Россия  
Дата: 16.08.10 01:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, xobotik, Вы писали:


X>>Задача реализовать конечный автомат, так чтобы весь текст между такими скобками "(* текст *)" и сами скобки включительно заменялись на пробел, т.е. " ".

X>>Реализация:
X>>
X>>        public static string RemoveComments(this IEnumerable<char> elements)
X>>        {
X>>        }
X>>


X>>Заранее спасибо


I>Конечный автомат не пойдет, нужен операционный


I>Вот описание автомата, который замещает конструкцию "(*любые символы кол.вом больше нуля*)" на пробел


Нужно и такое заменять на пробел (**).

I>примерно так:

I>(* даст на выходе (*
I>(*что нибудь даст на выходе (*что нибудь
I>(*) даст (*)
I>(**) даст пробел
I>(*что нибудь*) даст что нибудь

I>итого


I>вход автомата


I>a — любой символ

I>е — конец строки
I>(
I>)
I>*

I>состояние автомата

I>0 начальное состояние/конечное состояние
I>1 пришла ( ожидается *
I>2 пришла (* ожидается *
I>3 пришла (** ожидается )

I>память

I>i — индекс элемента начиная с которого подавлялся вывод символов
I>неявно присутствует номер текущей позиции

I>выход


I>pi — печать все символы начиная с i и последнего

I>pc — печатать текущий
I>ps — печатать пробел
I>ri — запомнить текущую позицию в i
I>пусто — пусто

I>переходы из состояния 0


I>на входе ( на выходе ri переход в 1

I>на входе a,*,),e на выходе pc переход в 0

I>переходы из состояния 1


I>на входе * на выходе пусто переход в 2

I>на входе (,),a,e на выходе pi переход в 0

I>переходы из состояния 2


I>на входе * на выходе пусто переход в 3

I>на входе ),(,a на выхде пусто переход в 2
I>на входе e на выходе pi переход в 0

I>переходы из состояния 3


I>на входе ) на выходе ps переход в 0

I>на входе * на выходе пусто переход в 3
I>на входе e на выходе pi переход в 0
I>на входе (,a на выходе пусто переход в 2

Теоретически понятно =) Спасибо=)
С уважением!
Re[2]: Реализация конечного автомата.
От: xobotik Россия  
Дата: 16.08.10 01:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, xobotik, Вы писали:


X>>Задача реализовать конечный автомат, так чтобы весь текст между такими скобками "(* текст *)" и сами скобки включительно заменялись на пробел, т.е. " ".

X>>Реализация:
X>>
X>>        public static string RemoveComments(this IEnumerable<char> elements)
X>>        {
X>>        }
X>>


X>>Заранее спасибо


I>Конечный автомат не пойдет, нужен операционный


В каком смысле не пойдет? Не оптимально, либо просто не решаемо? Просто необходимо реализовать эту задачу в виде конечного автомата.
С уважением!
Re[3]: Реализация конечного автомата.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.08.10 02:54
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Здравствуйте, Ikemefula, Вы писали:


I>>Конечный автомат не пойдет, нужен операционный


X>В каком смысле не пойдет? Не оптимально, либо просто не решаемо?


Здесь

X>Просто необходимо реализовать эту задачу в виде конечного автомата.

Успехов!
Re[3]: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.08.10 09:15
Оценка:
Здравствуйте, xobotik, Вы писали:

X>>>Заранее спасибо


I>>Конечный автомат не пойдет, нужен операционный


X>В каком смысле не пойдет? Не оптимально, либо просто не решаемо? Просто необходимо реализовать эту задачу в виде конечного автомата.


В виде КА не выйдет, с использованием КА — вполне.
Re[3]: Реализация конечного автомата.
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.08.10 10:08
Оценка:
Здравствуйте, xobotik, Вы писали:


I>>Вот описание автомата, который замещает конструкцию "(*любые символы кол.вом больше либо равно нуля*)" на пробел


X>Нужно и такое заменять на пробел (**).


и такое тоже заменяется
Re: Реализация конечного автомата.
От: matumba  
Дата: 17.08.10 08:26
Оценка:
Здравствуйте, xobotik, Вы писали:
X>Вопрос где ошибка?

Где-то между ушами. Вам, видимо, понадобится промежуточный буфер, где будет временно накапливаться '(*....' последовательность. И если она будет синтаксически верная, вы её выкинете, а нет — выведите в результат.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.