![]() |
|
|
#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. |