|
|
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Мне нужно выделить из текста блоки разного типа. У каждого типа есть начальный маркер и конечный маркер. Сейчас есть два типа текстовых блоков - инструкция и тест. Соответственно маркеры выглядят так: авторSOI – start of instruction EOI – end of instruction SOT – start of test EOT – end of test И текст выглядит так: авторSOI Line1 Line2 Line3 EOI SOT Line4 Line5 Line6 EOT Мой топорный вариант выглядит так. Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. И он работает если в тексте есть два блока. Но если текст выглядит скажем так авторSOI line1 line2 line3 EOI SOT line4 line5 line6 EOT SOT line7 line8 line9 EOT SOI line10 line11 line12 EOI То весь мой парсер ломается. Как можно улучшить алгоритм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 09:35 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Сформулируйте все условия, а не основные. 1) Что значит "выделить"? что хотите получить в итоге и в каком виде? 2) Есть ли гарантия, что любой текст, не являющийся маркером, находится в блоке? или бывает текст вне блоков (в т.ч. "пустые" строки)? 3) Есть ли гарантия согласованности разметки? или возможны пересечения блоков, незакрытые блоки и пр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:12 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7То весь мой парсер ломается. Как можно улучшить алгоритм? 1)расписать синтаксис в форме Бэкуса — Наура (BNF) 2)запрограммировать автомат (если неограниченной вложенности нет - то конечный) нужно последовательно обрабатывать каждый символ(максимум заглядывая на один вперёд, но в этой задаче не придётся) и изменять состояние , а не пытаться сканировать строку вперёд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:34 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
AkinaСформулируйте все условия, а не основные. 1) Что значит "выделить"? что хотите получить в итоге и в каком виде? 2) Есть ли гарантия, что любой текст, не являющийся маркером, находится в блоке? или бывает текст вне блоков (в т.ч. "пустые" строки)? 3) Есть ли гарантия согласованности разметки? или возможны пересечения блоков, незакрытые блоки и пр? Нужно скопировать текст в буфер между маркерами SOI-EOI , SOT-EOT. скажем в HTML документе тоже есть блоки – header, paragraph, div. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:50 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
или использовать готовый регэкс автомат типа такого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 10:53 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
OoCcили использовать готовый регэкс автомат типа такого у меня голый С. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:14 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7 , пожалуйста, отвечайте на те вопросы, которые Вам задают, а не на вопросы, которые Вы себе сами придумали. jenya7Нужно скопировать текст в буфер между маркерами SOI-EOI , SOT-EOT. И что же должно быть помещено в буфер для показанного Вами текста? jenya7скажем в HTML документе тоже есть блоки – header, paragraph, div Да ладно... а мужики-то не знают... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:17 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7OoCcили использовать готовый регэкс автомат типа такого у меня голый С. не в С или С++ проблема, а влезет ли в твой контроллер библиотека регулярок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:17 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7OoCcили использовать готовый регэкс автомат типа такого у меня голый С. в этом нет проблем, большинство парсер-генераторов поддерживают С да и нагенерированный автомат выполняется элементарно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:26 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), для этой задачи с конечным автоматом из трёх состояний и генерить ничего не надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:41 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Изопропил, не скажи, как раз таки эту задачу можно решить за один побайтный проход если иметь свой лексер-генератор и знать как он работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:56 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
ничего не понимаю. что происходит. есть строка "SOI Happy EOI SOT New EOT SOT Year EOT SOI Folks EOI ". блоки приходят в любом порядке. могут быть только SOI-EOI, SOI-EOI…. Или SOT-EOT, SOT-EOT….. или вперемежку SOI-EOI, SOT-EOT, SOI-EOI, SOT-EOT . в результате нужно получить buf1 = Happy, buf2 = New, buf3 = Year, buf4 = Folks. можно даже не одновременно а по очереди. какие регексы, какие библиотеки. задача на несколько строк кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 11:58 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Изопропил, не скажи, как раз таки эту задачу можно решить за один побайтный проход если иметь свой лексер-генератор и знать как он работает можно решить естественно за один проход и без генератора ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:04 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7задача на несколько строк кода. правильно. нехрен искать какие то символы впереди один цикл по исходной строке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:05 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7ничего не понимаю. что происходит. есть строка "SOI Happy EOI SOT New EOT SOT Year EOT SOI Folks EOI ". блоки приходят в любом порядке. могут быть только SOI-EOI, SOI-EOI…. Или SOT-EOT, SOT-EOT….. или вперемежку SOI-EOI, SOT-EOT, SOI-EOI, SOT-EOT . в результате нужно получить buf1 = Happy, buf2 = New, buf3 = Year, buf4 = Folks. можно даже не одновременно а по очереди. какие регексы, какие библиотеки. задача на несколько строк кода. ну если тебе нужно один раз найти, то никаких проблем Код: plaintext 1. 2. 3. 4. смотришь какой раньше и ищешь его завершение, очень топорно, но работать будет а вот если требуется какое-то решение, которое обслуживает протокол приближенный к реальному времени, то извольте учить конечные автоматы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:11 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Изопропилможно решить естественно за один проход и без генератора ) можно, но что-то не хочется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:14 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Изопропил, ну в этом то и загвоздка. мы нашли начало, нашли конец, но стартовый маркер может встретиться где то еще в тексте. впрочем можно выставить флаг что стартовый маркер уже найден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:15 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)jenya7ничего не понимаю. что происходит. есть строка "SOI Happy EOI SOT New EOT SOT Year EOT SOI Folks EOI ". блоки приходят в любом порядке. могут быть только SOI-EOI, SOI-EOI…. Или SOT-EOT, SOT-EOT….. или вперемежку SOI-EOI, SOT-EOT, SOI-EOI, SOT-EOT . в результате нужно получить buf1 = Happy, buf2 = New, buf3 = Year, buf4 = Folks. можно даже не одновременно а по очереди. какие регексы, какие библиотеки. задача на несколько строк кода. ну если тебе нужно один раз найти, то никаких проблем Код: plaintext 1. 2. 3. 4. смотришь какой раньше и ищешь его завершение, очень топорно, но работать будет а вот если требуется какое-то решение, которое обслуживает протокол приближенный к реальному времени, то извольте учить конечные автоматы я думал об этом. как то не очень элегантно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:17 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7я думал об этом. как то не очень элегантно.лесенка из побайтных switch как видимо прелагает Изопропил ну а если и это не гоже kealon(Ruslan).., то извольте учить конечные автоматы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 12:22 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7ну в этом то и загвоздка. мы нашли начало, нашли конец не надо ничего искать - вот в чём дело- достаточно принимать решение на основании текущего символа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:15 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
недостаточное знакомство разработчиков с конечными автоматами приводит к появлению микроконтроллерных устройств с диким поведением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:18 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
так работает. Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. можно заинлайнить повторяющийся код. сейчас попробую сделать на state machine. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:33 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
так на state machine. Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. наверно так все таки есть выигрыш и по speed и по size. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 13:54 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7так на state machine. наверно так все таки есть выигрыш и по speed и по size. не особо ты только логику верхнего уровня загнал в автомат (и то вопрос) самое плохое место на нижнем уровне Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 14:08 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Не понятно что должно происходить при нарушении порядка начал и концов, например Код: sql 1. Сделал игнорирование таких некорректно оформленных блоков. Еще у тебя никак не задается размер буфера, что чревато выходом за его пределы. Исходник Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 14:14 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), да. это самое плохое место. не знаю пока как победить. есть коечно одно решение которое придумали до меня - обрамлять тэги кавычками <SOI>, <EOI>, <SOT>, <EOT> или <I>, <I/>, <T>, <T/>. но это решение не такое генерик как хотелось бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 14:20 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Dima T, спасибо. попробую доработать. почему то парсит один блок и выходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 15:04 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7Dima T, спасибо. попробую доработать. почему то парсит один блок и выходит. Ты мой код запускал? Там должно быть так Код: plaintext 1. Код: plaintext Если на какой-то другой строке неправильно работает - давай строку, поправлю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 15:16 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Dima T, моя ошибка. все класно работает. Dima T как всегда крут. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 15:18 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Пользуйся. Еще думаю неправильно возвращать часть строки если она целиком в буфер не поместилась, наверно лучше пустую возвращать Код: plaintext 1. 2. 3. 4. 5. Сам подумай как правильнее ошибки обрабатывать, что где проверяется я подписал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 15:51 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Dima TЕще думаю неправильно возвращать часть строки если она целиком в буфер не поместилась, наверно лучше пустую возвращать лучше не копировать, а возвращать начало текста и длину, проще будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2017, 16:05 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7у меня голый С.Ну вот, а здесь приличный форум. jenya7ничего не понимаю. что происходит.Это нормально, вы же задали вопрос на sql.ru. jenya7задача на несколько строк кода.Только если писать на ультракоротком языке. На C побольше выйдет. Кстати, форум «C++» -- он и для вопросов по C тоже. Dima T Код: plaintext 1. Так вы, Dim, любите буферы фиксированой длины? kealon(Ruslan)лучше не копировать, а возвращать начало текста и длину, проще будетА я бы вообще ничего не возвращал, а просто вызывал бы функции обработки блоков: Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. Вывод на консоль: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 05:02 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Пётр СедовТак вы, Dim, любите буферы фиксированой длины? в контроллерах всегда овердохера динамической памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 13:12 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, у Dima T код раза в 3 меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 17:31 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2017, 19:46 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
ИзопропилПётр СедовТак вы, Dim, любите буферы фиксированой длины? в контроллерах всегда овердохера динамической памяти?В этой задаче не нужно динамическое распределение памяти, в моём коде его и нет. Кстати, автор вопроса не писал, что задача для controller-а. jenya7Пётр Седов, у Dima T код раза в 3 меньше.Это Perl-овская краткость, когда кода мало, но надо мозг сломать, чтобы понять, что тут происходит. Кстати, Perl уже почти никому не нужен , и это неслучайно. По коду Dima T: * Плохо-читабельный write-only код. Сбивающие с толку приёмы, например указатель p смещается как в заголовке цикла, так и в его теле: Dima T Код: plaintext 1. 2. 3. 4. 5. 6. * Использование буфера фиксированной длины. Приемлемо разве что в учебных заданиях, во «взрослом» коде -- почти никогда. Кроме случаев, когда есть гарантированное ограничение на длину строки (например, WinAPI-шная константа MAX_PATH, которая используется в структуре WIN32_FIND_DATA). Но вы такое гарантированное ограничение не упоминаете. * Код, который обрабатывает блоки, не знает тип блока: Dima T Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Надо ещё выводить на консоль тип блока -- instruction или test. * Не удаляются пробелы до и после блоков (" New ", " Folks " -- с пробелами). Хотя, если вам это и не надо, то мой код можно упростить: Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. Вывод на консоль: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 03:11 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Пётр СедовКстати, автор вопроса не писал, что задача для controller-а. это не тайна, есть предыдущие вопросы и ответы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 21:08 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
Пётр Седов* Использование буфера фиксированной длины. Приемлемо разве что в учебных заданиях, во «взрослом» коде -- почти никогда. Кроме случаев, когда есть гарантированное ограничение на длину строки (например, WinAPI-шная константа MAX_PATH, которая используется в структуре WIN32_FIND_DATA). Но вы такое гарантированное ограничение не упоминаете. тут в чем проблема. я пишу под эмбедед. если не использоать буфер фиксированной длины то нужна динамическая алокация памяти. а в эмбедед это плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 15:18 |
|
||
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#18+
jenya7, если вам надо блоки иметь как ноль-завершаемые строки, и можно менять содержимое исходной строки, то можно поступить так, как делает функция strtok: писать завершающие нулевые char-ы ('\0') прямо в исходную строку: Код: plaintext 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. Вывод на консоль: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 05:20 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1340515]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
96ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 456ms |

| 0 / 0 |
