Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
| Saraby |
16.03.2006 19:29
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
Здрасте, я здесь новичок, так что не судите строго за вопросы.
У меня проблема связана с парсеровщиком. Нужно разбить текст на блоки (хотябы) и добавить эти блоки в таблицу (на сервере). На входе - текст вроде: BEGIN bla-bla-bla bla-bla-bla END BEGIN; Далее могут идти похожие блоки, но вместо BEGIN другие определенные слова. Если есть какие-нибудь советы по такой разбивке, подскажите, буду очень благодарна. PS В грамматиках я не очень, так что... |
| Бродяжник |
17.03.2006 14:31
Сообщение
#2
|
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Поскольку задача сформулирована очень обще, ответить толком трудновато. Если в общем случае текст имеет структуру вида
{ * } { * } { * } где * - произвольный текст, а {} - пары некоторых ограничителей, и при этом между блоками нет никакого левого мусора, то задача упрощается. Если на самом деле все гораздо запутаннее, то... Упрощенную задачу можно решать так: Считываем из входного потока произвольный открывающий разделитель. Если это не он, то выдаем ошибку. А если он, то запоминаем его и читаем из входного потока текст, накапливая его в буфер. Как только мы натыкаемся на что-то, что не есть текст, смотрим: это что? ожидаемый закрывающий разделитель? Или какое-то левое служебное слово? Если левое, выдаем ошибку. Если это правильный разделитель, то кидаем содержимое буфера на сервер и возвращаемся в начало цикла, чтобы прочесть очередной произвольный открывающий разделитель. Вот пока и все. Немного сумбурно... |
| Saraby |
17.03.2006 16:35
Сообщение
#3
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
Нет, мусора между блоками нет (в идеале). Проблема в том, что вместо ограничителя (char) стоит слово (string). Как проверить начинается ли строка с "зарезервированного" слова и заканчивается ли она "зарезервированным" словом - что в совокупности составляет блок, который мне нужен.
Ну например текст: SING abc IS "Алфавит" HEAD ('Упорядоченная последовательность символов') END SING; LOG adsdd IS "Измененный алфавит" HEAD ('Последовательность символов') END LOG; Мне извесно, что этот текст (строка) содержит блоки, которые должны начинаться со слова SING или LOG и заканчиваться END SING; или END LOG; соответственно. Так вот, мне нужно взять по отдельности каждый блок и одновременно проверить их на правильность, т е чтобы на выходе не было результата вроде: LOG adsdd IS "Измененный алфавит" HEAD ('Упорядоченная последовательность символов') END SING; ??? Сообщение отредактировано: Saraby - 17.03.2006 16:36 |
| hardcase |
17.03.2006 19:12
Сообщение
#4
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Могу дать парсер строки, который способен разбивать строку на токены - числа, операторы, идентификаторы и терминальные символы, которые ты сам можешь указать (строковые константы не поддерживаются). Кроме того, парсер чувствителен к регистру (так и не добавил опции отключения сей протеворечивой функции)
Всё написано мною на делфи, протестено. А возможно использовать другой тип входных файлов? Например использовать XML формат. И сбросить парсинг XML на DOM-инспектора. Это скорее всего лучший вариант. Вот пример использования парсера: procedure TForm1.OnLexem(Sender: TLexParser; const Lexem: TLexem); Прикрепленные файлы
LexemParser.pas ( 33.22 килобайт )
Кол-во скачиваний: 449-------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
| Saraby |
25.04.2006 10:38
Сообщение
#5
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
спасиб, тока разобраться - не меньше, чем 0,5 литра надо. У меня еще вопрос - как реализовать проверку текста с помощью case..end - есть текст, мы бежим циклом по каждому символу и в конструкции case делаем определенные действия в зависимости от того, символ это алфавитный или цифра, или еще какая нибудь закорючка. Если будет пример такого кусочка кода - то отдельное тому спасибо.
|
| Бродяжник |
25.04.2006 11:55
Сообщение
#6
|
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Типа так? (TP 6.0)
Program Example; |
| Saraby |
25.04.2006 13:50
Сообщение
#7
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
Спасибо тебе большое, именно это мне и надо было!
|
| Бродяжник |
25.04.2006 14:35
Сообщение
#8
|
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
Пожалуйста!
|
| Saraby |
25.04.2006 14:52
Сообщение
#9
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
|
| Бродяжник |
25.04.2006 15:30
Сообщение
#10
|
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
А где он находится?
"Скажи, и я скажу..." |
| Saraby |
25.04.2006 15:32
Сообщение
#11
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
|
| volvo |
25.04.2006 16:06
Сообщение
#12
|
|
Гость |
For i := 1 to Length(s) Do |
| Saraby |
26.04.2006 12:25
Сообщение
#13
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
Спасибо, пока пищи для размышления много и свою первоначальную задачу я может быть решу, но конечно хотелось бы знать, если кто-то подобным занимался, есть ли более удобный, простой или "эргономичный" способ решения такого рода задач - я имею ввиду парсинг строк какого-либо кода?
|
| Saraby |
27.04.2006 15:35
Сообщение
#14
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
Цитата Function StrOneSpace(s: String): String; Функция удаляет из строки все лишние пробелы таким образом, что между остальными символами всегда остается только один пробел. вот эта цитата из паскалевского фака по строкам, туда я вопрос задавать не решаюсь, но не задавать его тоже глупо! Поэтому вопрос такой: а если в строке есть символы #13 и их надо заменить на один пробел, причем неизвесно сколько #13 символов между словами, т.е. bla#13#32#32#13bla - короче надо заменить всю лабуду между словами bla bla на один пробел. Это как делается? |
| volvo |
27.04.2006 16:11
Сообщение
#15
|
|
Гость |
Ты об этом:
type? Я только одного не пойму: если тема в разделе Дельфи, почему тебя вообще интересует Паскалевский FAQ? В Дельфях есть столько своих функций для работы со строками, что Паскалю и не снилось!!! Почему ты их не используешь? Или тему перенести в "Паскаль", чтобы избежать путаницы в дальнейшем? |
| Saraby |
28.04.2006 14:53
Сообщение
#16
|
|
Группа: Пользователи Сообщений: 9 Пол: Женский Реальное имя: Настя Репутация: 0 |
Я только одного не пойму: если тема в разделе Дельфи, почему тебя вообще интересует Паскалевский FAQ? В Дельфях есть столько своих функций для работы со строками, что Паскалю и не снилось!!! Почему ты их не используешь? Или тему перенести в "Паскаль", чтобы избежать путаницы в дальнейшем? Да, я об этом, а тему переносить не надо, я просто, видимо, не все дельфовские функции знаю, а тут FAQ про паскалевские строки подвернулся, вот я и решила задать вопрос...sorry |
| hardcase |
28.04.2006 21:53
Сообщение
#17
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
я просто, видимо, не все дельфовские функции знаю Набери в дельфийской справке String handling routines - он тебе полный список доступных функций расскажет. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
![]() ![]() |
|
Текстовая версия | 8.12.2025 22:06 |