Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#16: 2013-11-10 11:27:37 ЛС | профиль | цитата
Леонид, в длинном исходном тексте могут быть все буквы и знаки. И буква "ж", которую мне менять не надо, тоже.
Т.е. результат работы компонента - непредсказуем.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8926
Рейтинг: 823
#17: 2013-11-10 11:58:14 ЛС | профиль | цитата
Tad, кроме "ж" есть "1 -- 9", "~", "@"...., и вообще, перед заменой можно проверить весь текст на наличие в нём всех символов от1 до 255 (даже Лев Николаевич не все из них использовал)
карма: 19

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#18: 2013-11-10 12:05:15 ЛС | профиль | цитата
Tad писал(а):
Т.е. результат работы компонента - непредсказуем.

А бсолютно предсказуем, и работает именно так, как я сказал
nesco писал(а):
Он изначально был разработан именно для замены нескольких последовательных Replace.


Последовательные Replace работают алгоритмическаи точно так же

Add(MainForm,2953706,70,119)
{
Width=310
Height=137
link(onCreate,13466306:doMultiReplace,[])
}
Add(Memo,11147911,126,49)
{
Left=10
Top=10
Strings=#2:ба|0:|
}
Add(Memo,11943332,217,49)
{
Left=70
Top=10
Width=85
Strings=#5:а=аб;|5:б=ба;|
}
Add(MultiReplace,13466306,175,133)
{
link(onResult,16640441:doText,[])
link(Text,11147911:Text,[(181,113)(132,113)])
link(ReplaceList,11943332:Text,[(188,113)(223,113)])
}
Add(Memo,16640441,280,112)
{
Left=185
Top=10
Width=95
}
Естественно, на символы разделители применяются ограничения. Если вам не нравится такое использование, то можете делать
nesco писал(а):
из дискретных элементов

как вам хочется
Вопрос считаю исчерпаным.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#19: 2013-11-10 12:21:32 ЛС | профиль | цитата
Леонид писал(а):
перед заменой можно проверить весь текст на наличие в нём всех символов от1 до 255
Согласен.
Допустим есть все.
Значит, следующий шаг - проверка на отсутствие сочетаний.
"жу" -есть
"жо" -есть
"жй" - Ура! Нет! Можно применить.
Ваши действия дальше ?
------------ Дoбавленo в 12.21:
nesco писал(а):
Вопрос считаю исчерпаным.
Принимается.
Биться лбом о стенку - занятие не из благодарных.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#20: 2013-11-10 12:25:23 ЛС | профиль | цитата
Tad писал(а):
Ваши действия дальше ?

А ваши Я не вижу поползновений выложить схему решения своего агоритма, где будет реализовано
Tad писал(а):
буква "ж", которую мне менять не надо

Те как бы ты сделал свою схему с 'аб', чтобы она работала как тебе нужно
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#21: 2013-11-10 13:19:15 ЛС | профиль | цитата
Neo писал(а):
Прямо не пойму где я дурак...
Если говорить о самых общих принципах проектирования, перефразируя применительно к HiAsm , то можно назвать три основных положения:
1. Компонент должен помогать выполнить задачу, а не становиться этой задачей.
2. При работе с компонентом пользователь не должен ощущать себя дураком.
3. Компонент должен работать так, чтобы пользователь не считал разработчика компонента дураком.
Довольно эмоциональные формулировки, но, тем не менее, верные.

nesco писал(а):
Те как бы ты сделал свою схему с 'аб', чтобы она работала как тебе нужно
Примерно так :
Составил бы карту замены и, не трогая исходную строку, сфоррмировал бы новую, а после уничтожил бы исходную.
А менять букву "а" в замене - это полный абсурд.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#22: 2013-11-10 13:43:45 ЛС | профиль | цитата
Tad писал(а):
Составил бы карту замены и, не трогая исходную строку, сфоррмировал бы новую, а после уничтожил бы исходную.А менять букву "а" в замене - это полный абсурд.

Как это сделать
Ну составили карты на каждую замену, но в следующей замене не будет того, что есть в предыдущей, как это все объединить после всех преобразований
Пример решения в студию.
карма: 22

0
Ответов: 8926
Рейтинг: 823
#23: 2013-11-10 18:10:12 ЛС | профиль | цитата
Neo писал(а):
..нужно самому мудрить с маской и перебором массива строк-замен..
Не нужно, уже намудрил code_32290.txt
карма: 19

0
файлы: 1code_32290.txt [6KB] [204]
Ответов: 704
Рейтинг: 7
#24: 2013-11-10 22:15:05 ЛС | профиль | цитата
Коллеги, не считайте дураком. Всю сознательную жизнь хиасмиста делал вот так: code_32292.txt

Потом совсем недавно узнал про компонент мультистрочной замены и возрадовался (в старой сборке его не было) - подумалось мне что он быстрее будет. (Скорость так и не удосужился замерить на хорошем кусочке текста)
Видимо у меня задача не та просто. Я-то думал что в компоненте все как в моей схеме, только компактнее, а оказалось что он работает именно как много реплейсов подряд. И сбило меня с толку именно то, какой формат замен у него - упорядоченный. Думал берет он и перебирает как по таблице их. Совпало - выкинул замененную строку и все. Так что возвращаюсь к своей любимой безотказной маске строк
И работает компонент нормально, просто те же замены, только удобнее их задавать, как я теперь понял.
карма: 0

0
файлы: 1code_32292.txt [684B] [199]
Разработчик
Ответов: 26153
Рейтинг: 2127
#25: 2013-11-10 22:30:55 ЛС | профиль | цитата
Neo писал(а):
И работает компонент нормально, просто те же замены, только удобнее их задавать, как я теперь понял

Так и есть -- много Replace подряд, только в текстовом представлении
карма: 22

0
Ответов: 9906
Рейтинг: 351
#26: 2013-11-11 07:29:07 ЛС | профиль | цитата
nesco писал(а):
Как это сделать

Обыкновенненькая задача лексического анализа
Левые части - регулярные выражения для лексем.
Правые части - данные для специфического (тупая замена) семантического правила.
Не забываем применять "правило самой длинной лексемы" - и всего-то делов.


карма: 9

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#27: 2013-11-11 09:37:26 ЛС | профиль | цитата
Galkov писал(а):
Обыкновенненькая задача лексического анализа

Есть гораздо проще путь для решения поставленной задачи -- исключения последовательных замен. Но я пока не буду его оглашать.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#28: 2013-11-11 10:11:00 ЛС | профиль | цитата
1) Вообще-то, я прикалывался
2) Но, поскольку я знаю некоторые приколы "лексического анализа" -- сомнения возникают насчет корректности "более простого" пути. Там хватает ехидненьких вопросов.
3) А отсюда мысль: а оно настолько надо, чтобы делать типа упрощенную версию сканера по фамилии MultiReplace ???

Не, ну полезность полноценного лексического анализатора - отрицать невозможно.
А вот его полу-версии будут и полу-работать.... Чего-то мне так пока кажется.
Стоит ли тратить время на полу-работающие версии

карма: 9

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#29: 2013-11-11 11:47:27 ЛС | профиль | цитата
Galkov писал(а):
Чего-то мне так пока кажется

Сейчас попытаюсь сделать прототип задуманного в схемном решении. можно будет взвесить все "за" и "против".
------------ Дoбавленo в 11.47:
Вот что получилось:

Add(MainForm,4056909,168,147)
{
Width=290
Height=543
Position=1
}
Add(MultiReplace,3890216,623,329)
{
Delimiter="~"
EndSymbol="§"
link(onResult,12618799:doMultiReplace,[])
link(ReplaceList,2130139:Text,[(636,271)(720,271)(720,208)(685,208)])
}
Add(Button,14455952,168,196)
{
Left=105
Top=480
TabOrder=-1
Data=String()
link(onClick,1935334:doEvent1,[])
}
Add(Memo,6716458,735,329)
{
Top=340
Width=275
Height=135
ScrollBars=3
}
Add(ArrayEnum,15051145,378,329)
{
link(onItem,3890216:doMultiReplace,[])
link(Array,4022026:Var2,[])
}
Add(Hub,1935334,238,196)
{
OutCount=4
link(onEvent1,2130139:doClear,[(648,202)(648,146)])
link(onEvent2,1792289:doClear,[(417,209)(417,258)(648,258)(648,230)])
link(onEvent3,9353500:doEnum,[(263,216)(263,139)])
link(onEvent4,14699846:doEnum,[(277,223)(277,405)])
}
Add(ArrayEnum,9353500,294,133)
{
link(onItem,12418591:doSplit,[])
link(onEndEnum,15051145:doEnum,[(333,146)(333,335)])
link(Array,14423470:Array,[])
}
Add(MultiStrPart,12418591,371,133)
{
Char="~"
Count=1
link(onSplit,5564057:doSplit,[])
}
Add(MultiStrPart,5564057,420,133)
{
Char="§"
Count=1
link(onSplit,11516340:doConvert,[])
}
Add(Convertor,11516340,469,133)
{
Mode=6
Digits=3
link(onResult,11787064:doStrCatDlm,[])
link(Data,9353500:Index,[(475,124)(363,124)(363,173)(307,173)])
}
Add(StrCatDelim,11787064,518,133)
{
Str1="{**r"
Str2="r**}"
Point(Delimiter)
link(onStrCatDlm,15082620:doEvent1,[])
}
Add(FormatStr,9121106,609,133)
{
Mask="%1~%2§"
link(onFString,2130139:doAdd,[])
link(Str1,12418591:Part1,[(615,124)(559,124)(559,173)(377,173)])
}
Add(Hub,15082620,567,133)
{
link(onEvent1,9121106:doString,[])
link(onEvent2,7706705:doString,[(592,146)(592,223)])
}
Add(FormatStr,7706705,609,217)
{
Mask="%1~%2§"
link(onFString,1792289:doAdd,[])
link(Str2,5564057:Part1,[(622,194)(426,194)])
}
Add(MultiReplace,12618799,672,329)
{
Delimiter="~"
EndSymbol="§"
link(onResult,6716458:doAdd,[])
link(ReplaceList,1792289:Text,[])
}
Add(StrList,2130139,679,133)
{
}
Add(StrList,1792289,679,217)
{
}
Add(ListBox,12472830,364,259)
{
Left=5
Top=5
Width=130
Height=135
Strings=#3:1=b|3:1=B|4:acdf|
}
Add(ListBox,14423470,280,56)
{
Left=140
Top=5
Width=130
Height=135
Strings=#12:1=b~test1=B§|12:1=B~TEST1=b§|4:a~c§|4:c~d§|4:d~f§|4:f~g§|
}
Add(Label,10866566,161,91)
{
Left=5
Top=150
Width=268
Height=17
Font=[MS Sans Serif,10,1,0,1]
Caption="1-Way"
AutoSize=1
Alignment=2
}
Add(Memo,951728,735,399)
{
Left=5
Top=175
Width=270
Height=135
ScrollBars=3
}
Add(ArrayEnum,14699846,560,399)
{
link(onItem,10281728:doMultiReplace,[])
link(Array,4022026:Var3,[(566,313)])
}
Add(GetDataEx,4022026,378,308)
{
link(Data,12472830:Array,[])
}
Add(MultiReplace,10281728,623,399)
{
Delimiter="~"
EndSymbol="§"
link(onResult,951728:doAdd,[])
link(ReplaceList,14423470:Text,[(636,383)(286,383)])
}
Add(Label,10477188,168,103)
{
Left=5
Top=315
Width=268
Height=17
Font=[MS Sans Serif,10,1,0,1]
Caption="2-Way"
AutoSize=1
Alignment=2
}

Алгоритм очень простой: 1-й проход -- меняем нужные вложения на индексные маркеры, 2-й проход -- меняем индескные маркеры на нужные замены.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#30: 2013-11-11 14:38:55 ЛС | профиль | цитата
nesco писал(а):
можно будет взвесить все "за" и "против"

Мне удобней взвешивать ДО, а не ПОСЛЕ
Наверное -- старый стал, и ленивый.

Ну вот нашел ты первый маркер. Ай какой молодец.
А вот только кто тебе сказал, что этот текст принадлежит первому маркеру, а не пятому. К примеру....

Есть служебные слова: IF, IFELSE, и т.п..
И ты нашел IF. Где гарантии, что это не начало IFELSE.
Есть цифирьки (кажется даже кто-то и приводил такое) 15, 0x15, и 153
И ты нашел 15. Где гарантии, что это не начало 153. Или продолжение 0x15

Ну и т.п..

карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)