powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обратный эскипированный разбор без спец.символов
9 сообщений из 34, страница 2 из 2
Обратный эскипированный разбор без спец.символов
    #38346551
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрна выходе получим:
Код: php
1.
$input = "x,<1,x/,/<1/,///, textarea and button/>/,y/,z/, textarea and button>,y,z"



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

И ещё я попытался её разобрать вашим же алгоритмом. Он рекурсивно не стал ничего разбирать, а обработал только один шаг рекурсии.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$input = "";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";

print_r($input);


function parse(&$arr, &$str, $start = 0){
  $el = 0;
  $arr[$el]="";
  while ($start<count($str)){
    switch($str[$start]){
      case "/" : $arr[$el] .= $str[++$start]; break;
      case "," : $arr[++$el]=""; break;
      case "<" : $arr[$el] = array(); $start = parse($arr[$el], $str, ++$start); break;
      case ">" : return $start; break;
      default  : $arr[$el] .= $str[$start];
    }
    $start++;
  }
  return $start;
}

$arr = array();
parse($arr, str_split($input));
print_r($arr);




Вывод работы (разрывы в строчках для форума я поставил сам)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,x///////////////,///////////////
<1///////////////,///////////////////////////////, textarea and button///////////////>
///////////////,y///////////////,z///////////////, textarea and button///////>
///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
/,y/,z/, textarea and button>,y,zArray
(
    [0] => x
    [1] => Array
        (
            [0] => 1
            [1] => x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,///////////////, textarea and button///////>
                      ///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
                      /,y/,z/, textarea and button>,y,z, textarea and button
        )

    [2] => y
    [3] => z
)



PS. Кстати, в HTML используется экипирование с операторами

Код: html
1.
<![CDATA[<sender>John Smith</sender>]]>



Будет заменено на

Код: html
1.
&lt;sender&gt;John Smith&lt;/sender&gt;
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346555
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПрограмёрна выходе получим:
Код: php
1.
$input = "x,<1,x/,/<1/,///, textarea and button/>/,y/,z/, textarea and button>,y,z"



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

И ещё я попытался её разобрать вашим же алгоритмом. Он рекурсивно не стал ничего разбирать, а обработал только один шаг рекурсии.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$input = "";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";
$input = "x,<1,".escape_str($input)."/, textarea and button>,y,z";

print_r($input);


function parse(&$arr, &$str, $start = 0){
  $el = 0;
  $arr[$el]="";
  while ($start<count($str)){
    switch($str[$start]){
      case "/" : $arr[$el] .= $str[++$start]; break;
      case "," : $arr[++$el]=""; break;
      case "<" : $arr[$el] = array(); $start = parse($arr[$el], $str, ++$start); break;
      case ">" : return $start; break;
      default  : $arr[$el] .= $str[$start];
    }
    $start++;
  }
  return $start;
}

$arr = array();
parse($arr, str_split($input));
print_r($arr);




Вывод работы (разрывы в строчках для форума я поставил сам)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,x///////////////,///////////////
<1///////////////,///////////////////////////////, textarea and button///////////////>
///////////////,y///////////////,z///////////////, textarea and button///////>
///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
/,y/,z/, textarea and button>,y,zArray
(
    [0] => x
    [1] => Array
        (
            [0] => 1
            [1] => x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,///////////////, textarea and button///////>
                      ///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
                      /,y/,z/, textarea and button>,y,z, textarea and button
        )

    [2] => y
    [3] => z
)




Ну так всё правильно вывел. Что написали, то и вывело :). Мы для того и экранировали символы, что бы то, что является строковым элементом не воспринималось как новый уровень или как несколько элементов (при наличии запятой).

Вы что хотите сделать? Если покажите в виде массива, что хотите загнать в строку (и хотите получить обратно), а на реальном примере Вам покажу как работает данный алгоритм. Тут просто кто-то кого-то не понял (или Вы меня, или как говорил, я задачу, хотя по Вашим рассуждениям думаю что понял правильно).
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346715
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЛенточная сериализация сетей только с помощью гуманоидных символов и безрекурсионный алгоритм распарсивания этой ленты.Нифига не понял, чем не устроили четыре спецсимвола: начало группы, разделитель, конец группы и экранирующий символ?
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346720
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернусь в начало.

Дан список

Код: sql
1.
a, b, c, ....



Представим его как S-выражение с небольшими изменениями. Без конструктора list и квоты.

Код: sql
1.
(a, b, c, ....)



Пришло b которое по сути тоже список (1,2)

Вставляем его так

Код: sql
1.
(a, (1,2), c, ....)



Если пришло b которое является не списком а строковым литералом то так
уж и быть оставим его строкой.

Код: sql
1.
(a, "1,2", c, ....)



Ситуацию когда внутри СТРОКИ b должна сидеть другая СТРОКА с - выкинем нахер.
Таких постановок не бывает. Строка - это суть - атом в контексте задачи разработки.
И в нее НЕ предусмотрено впихивать или инкапсулировать другие такие-же строки.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346762
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovLumixЛенточная сериализация сетей только с помощью гуманоидных символов и безрекурсионный алгоритм распарсивания этой ленты.Нифига не понял, чем не устроили четыре спецсимвола: начало группы, разделитель, конец группы и экранирующий символ?

Не устроило тем, что вот этот результат плохо поддается ручной обработке, а это всего 5 уровней вложенности, а что будет если из будет 100.

Код: plaintext
1.
2.
3.
4.
5.
x,<1,x/,/<1/,x///,///<1///,x///////,///////<1///////,x///////////////,///////////////
<1///////////////,///////////////////////////////, textarea and button///////////////>
///////////////,y///////////////,z///////////////, textarea and button///////>
///////,y///////,z///////, textarea and button///>///,y///,z///, textarea and button/>
/,y/,z/, textarea and button>,y,z



Если использовать ручной текстовый набор, то предполагается, что с этим будет работать человек. А если у нас получается формат, который человека убивает, то какой смысл тогда работать с эскипированием.

На данный момент мы прорабатываем вариант создания инструмента, который будет удобно помогать человеку проставлять размер пакета. Тогда и вручную можно будет работать и понятно будет читать.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346769
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли пришло b которое является не списком а строковым литералом то так
уж и быть оставим его строкой.

Код: sql
1.
(a, "1,2", c, ....)



Ситуацию когда внутри СТРОКИ b должна сидеть другая СТРОКА с - выкинем нахер.
Таких постановок не бывает. Строка - это суть - атом в контексте задачи разработки.
И в нее НЕ предусмотрено впихивать или инкапсулировать другие такие-же строки.

В строку можно вставлять другую строку, более, того ваше же решение его и позволяет делать, достаточно просто эскипировать символ (флаг) контектста!

То есть я только сейчас понял суперсуть вашей идеи: открывающая кавычка - это начало нового контекста, которая отключает значение символов (флагов запятая и скобки), в новом "строковом контексте" они являются просто литералами. Закрывающая кавычка выключает строковый контекст и символы запятая и скобки опять начинают работать как флаги. Чтобы кавычка строки случайно не отключила "строковый контекст" мы её эскипируем.

В принципе вы это и предлагали на примере CSV, но мне что-то мозгов не хватило сразу прикрутить это решение к сеткам. Я думал это канает только для таблиц. А как только у меня голове осенило по поводу кавычки включают и отключают новый семантический контекст, то до меня все сразу дошло как эту схему перенести на сетки.

Сейчас голова уже не варит, завтра попробую эту схему на ленточную основу положить и прикрутить алгоритм разбора
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346774
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на уставшую голову пока ложится только двухпроходный алгоритм
1 проход) вырезаем все строки и складываем их в таблицу, оставляя вместо строк номера строк в таблице [номер строки, строка, адрес вставки строки]
2 проход) пилим оставшуюся материю в цикле и складываем в таблицу, беря строку по адресу из таблицы первого прохода [номер узла, строка, номера родителей, номера детей]

Код: plaintext
1.
(a, ((у, ф,), 2), c, ...) => (1, ((2, 3,), 4), 5, ...) // это адреса в таблице первого прохода



В принципе должно получиться очень круто.
Завтра опробуем.
mayton, пока предварительно огромное спасибо за разжевывание своей суперской идеи.
И сорри, что с первого раза не дошло. :-)
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38346796
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да незачто.

Я собственно идею только щас изложил. Мой первый пост - то просто цитата с википедии. С пояснением.
...
Рейтинг: 0 / 0
Обратный эскипированный разбор без спец.символов
    #38347815
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixНе устроило тем, что вот этот результат плохо поддается ручной обработке, а это всего 5 уровней вложенности, а что будет если из будет 100Тоже мне, попугай Кеша: "А если дождь во время усушки?!"
В качестве специальных используются относительно редкоиспользуемые символы.
Автор TeX-а выбрал { и } для ограничителей группы. Что вам мешает сделать тоже самое?
Есть вариант с двойной и одинарной кавычкой, которые выбираются так, чтобы внутри не было окаймляющего символа.
Есть "Объединение"'БезПробела' (или 'Объединение' || "БезПробела"), есть 'объединение' "с пробелом" ( REXX ) - прекрасно читается после минимальной практики и легко пишется хоть руками, хоть автоматом.
Есть классический сишный вариант: "Строка с \" кавычкой внутри". Точно так же легко читается и пишется.
Есть SMTP-экранирование - данные начинаются с новой строки после команды DATA. Заканчиваются строкой из одной точки. Если в тексте есть строка из одной точки - она удваивается. Если при чтении данных мы видим строку, которая начинается с точки и содержит более одного символа - эта точка убирается.
Есть, в конце-концов MIME (пять RFC c 2045 по 2049 ).
Полезно изучить text/plain Format=Flowed - позволяет, например, складывать длинные строки сохраняя цитирование.

P.S. Прям как в анекдоте: "Нет вы посмотрите на этого поца - всю Одессу удовлетворяет, а его, видите-ли, нет!"
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обратный эскипированный разбор без спец.символов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]