|
|
|
Найти текстовые блоки разного типа в С.
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=24&tid=1340515]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
124ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 476ms |

| 0 / 0 |
