Задача реализовать конечный автомат, так чтобы весь текст между такими скобками "(* текст *)" и сами скобки включительно заменялись на пробел, т.е. " ".
Реализация:
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();
}
На вход подаю "(*)" метод ничего не возвращает, а должен по идеи оставить входные данные без изменения. Вопрос где ошибка?
Во всех остальных случаях, вроде как работает правильно.
Здравствуйте, xobotik, Вы писали:
X>На вход подаю "(*)" метод ничего не возвращает, а должен по идеи оставить входные данные без изменения. Вопрос где ошибка? X>Во всех остальных случаях, вроде как работает правильно.
А у тебя что, отладчик отвалился ?
case 0x2:
if (element == '*')
{
state = 0x3;
}
else
{
state = 0x2;
}
Очевидно, в состояние 3 перехода не будет и автомат остаётся во 2м состоянии.
( -> 1
* -> 2 ) -> 2
Но вообще не ясно условие задачи и код вообще говоря похож на какую то фигню.
что должно быть например в таких случаях
(*
(*(**)
(*ааа
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, xobotik, Вы писали:
X>>На вход подаю "(*)" метод ничего не возвращает, а должен по идеи оставить входные данные без изменения. Вопрос где ошибка? X>>Во всех остальных случаях, вроде как работает правильно.
I>Очевидно, в состояние 3 перехода не будет и автомат остаётся во 2м состоянии.
I>( -> 1 I>* -> 2 I>) -> 2
Ну вообще-то он не останется. Мы ждем в строке еще одну вторую звездочку перебирая элементы. Как только нашли звезду переходим в третье состояние.
I>Но вообще не ясно условие задачи и код вообще говоря похож на какую то фигню.
Спасибо.
I>что должно быть например в таких случаях I>(* I>(*(**) I>(*ааа
(* по идеи везде.
Значит получается нужно заводить какую-либо переменную для накопления результатов после каждого состояния?
Здравствуйте, xobotik, Вы писали:
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
Здравствуйте, xobotik, Вы писали:
I>>Очевидно, в состояние 3 перехода не будет и автомат остаётся во 2м состоянии.
I>>( -> 1 I>>* -> 2 I>>) -> 2
X>Ну вообще-то он не останется. Мы ждем в строке еще одну вторую звездочку перебирая элементы. Как только нашли звезду переходим в третье состояние.
для варианта (*) автомат остаётся во втором состоянии.
X>Значит получается нужно заводить какую-либо переменную для накопления результатов после каждого состояния?
Да, я поработал немного за тебя, ибо скучно, даже Expendables не помогли Смотри в этом же треде
Здравствуйте, xobotik, Вы писали:
X>Наверно по другому сформулирую. Надо ли учитывать в этом автомате отсутствие закрывающей скобки вида "*)" или открывающей "(*"?
Это ж от задачи зависит
Может тебе вообще нужно подавлять ажно такое (* (* (* *) *) *)
В этом случае автомат, который я привел, не годится в прынцыпе ибо нужно средство бОлее мощное.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, xobotik, Вы писали:
X>>Наверно по другому сформулирую. Надо ли учитывать в этом автомате отсутствие закрывающей скобки вида "*)" или открывающей "(*"?
I>Это ж от задачи зависит
Задача заменять что-то типа этого: (* текст *) на пробел.
I>Может тебе вообще нужно подавлять ажно такое (* (* (* *) *) *)
Такого не надо =)
I>В этом случае автомат, который я привел, не годится в прынцыпе ибо нужно средство бОлее мощное.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, xobotik, Вы писали:
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
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, xobotik, Вы писали:
X>>Задача реализовать конечный автомат, так чтобы весь текст между такими скобками "(* текст *)" и сами скобки включительно заменялись на пробел, т.е. " ". X>>Реализация: X>>
Здравствуйте, xobotik, Вы писали:
X>Здравствуйте, Ikemefula, Вы писали:
I>>Конечный автомат не пойдет, нужен операционный
X>В каком смысле не пойдет? Не оптимально, либо просто не решаемо?
Здесь
X>Просто необходимо реализовать эту задачу в виде конечного автомата.
Успехов!
Здравствуйте, xobotik, Вы писали:
X>>>Заранее спасибо
I>>Конечный автомат не пойдет, нужен операционный
X>В каком смысле не пойдет? Не оптимально, либо просто не решаемо? Просто необходимо реализовать эту задачу в виде конечного автомата.
В виде КА не выйдет, с использованием КА — вполне.
I>>Вот описание автомата, который замещает конструкцию "(*любые символы кол.вом больше либо равно нуля*)" на пробел
X>Нужно и такое заменять на пробел (**).
Здравствуйте, xobotik, Вы писали: X>Вопрос где ошибка?
Где-то между ушами. Вам, видимо, понадобится промежуточный буфер, где будет временно накапливаться '(*....' последовательность. И если она будет синтаксически верная, вы её выкинете, а нет — выведите в результат.