![]() |
|
#1
|
||||
|
||||
![]() И опять Здравствуйте!
![]() Есть вопрос, про парсинг. Дан текст и надо проверить на кол-во открывающихся/закрывающихся скобок, и если они не совпадают, то выдать ошибку. Притом: если скобка (любая) записана в комментарии, то ее считать не надо и если скобка записана в двойных кавычках "...", то ее тоже считать не надо. Комментарии могут быть такие: 1. // это одно строчный комментарий (как в делфи) 2. /* это много строчный комментарий (как в С) */ Скобки могут быть такие: { } [ ] ( ) < > Посылать в гугл не надо, только оттуда... Поэтому ссылки типа " http://www.google.com.ua/search?sour...BB%D1%84%D0%B8 " не подходят. ЗЫ Обычные функции (delete, pos, posEx) тут, как я думаю, не совсем подойдут, точнее подойдут, но ну уж очень надо сильно много проверок. Есть идеи? |
#2
|
||||
|
||||
![]() Так же думаю надо вставить приоритет скобок.
Поидее '{' имеет больший приоритет чем '(', а она в свою очередь выше '['... И вот еще одна проблемка: ({)} так стоять скобки не могут... Вот тут то как раз и начинаются сложности... Вот только что нашел вот такую реализацию (через стек): Код:
function Check(const S:string):boolean; var i:integer; Stack:TStack; c:char; begin Result:=false; Stack:=TStack.Create; for i:=1 to Length(S) do begin if not (S[i] in ['{','[','(','}',']',')']) then continue; if S[i] in ['{','[','('] then Stack.Push(@S[i]) else if Stack.Count>0 then begin case Char((Stack.Peek)^) of '[': c:=']'; '(': c:=')'; '{': c:='}'; else c:=Chr(0); end; if c<>S[i] then begin if Stack.Count=0 then ShowMessage('ошибка в '''+S[i]+'') else ShowMessage('ошибка в '''+c+''); exit; end else Stack.Pop; end else begin ShowMessage('ошибка в '''+S[i]+''); exit; end; end; if Stack.Count>0 then begin ShowMessage('ошибка в '''+Char((Stack.Pop)^)+''); exit; end; Stack.Free; Result:=true; end; Может есть другой вариант? (хотя и этот не плох, нашел его после создания темы...) Последний раз редактировалось v1s2222, 01.10.2010 в 15:39. |
#3
|
||||
|
||||
![]() Для компиляции выше описанной реализации надо подключить модуль: "Contnrs", для стека.
|
#4
|
|||
|
|||
![]() Почему бы не использовать Pos.
Не так и громоздко Особо не тестировал, но вроде работает. Тут нет проверки на обязательный закрывающий комментарий */ и на правильность кавычек PHP код:
|
#5
|
||||
|
||||
![]() Ща посмотрим, спасибо! +
Посмотрел, впринципе нормально, но не совсем то что надо. Если например писать: { ( } ) - то должна быть ошибка, т.к. нет приоритета скобок, а у тебя все правильно. Ну да ладно, взял уже пример работы через стек. Помогаю за Спасибо ![]() Последний раз редактировалось v1s2222, 03.10.2010 в 11:35. |