"Регулярные выражения"

Вот к примеру есть такой текст:
LowerCase(DateTimeToStr(Now));
Возможно ли вообще, и если да то как, проверить парность всех скобок?
← Апрель 2006 → | ||||||
1
|
2
|
|||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
6
|
7
|
8
|
|
12
|
15
|
|||||
За последние 60 дней ни разу не выходила
Сайт листа:
http://codeguru.ru
Открыт:
21-09-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.prog.prog-list@subscribe.ru
Адрес
модератора: comp.soft.prog.prog-owner@subscribe.ru
Вот к примеру есть такой текст:
LowerCase(DateTimeToStr(Now));
Возможно ли вообще, и если да то как, проверить парность всех скобок?
Hello AleX,
Wednesday, April 26, 2006, 3:28:37 AM, you wrote:
bool bPermCoun=true;
bool bPermCoun2=true; //объясняется ниже
{
Если индекс символа больше 1
{
Если символ - кавычка
{
если предыдущий символ не '\\' bPermCoun=!bPermCoun;
}
Если символ - '/'
{
если предыдущий символ '/' break;
}
} иначе {
Если символ - кавычка
{
bPermCoun=!bPermCoun;
}
}
если bPermCoun и bPermCoun2
{
A> Если символ - открывающая скобка, увеличить счетчик на 1.
A> Если символ - закрывающая скобка, уменьшить счетчик на 1.
}
}
При построчном считывании еще надо учесть 2 тонкости. Наличие "/*" не после "/"
bPermCoun2=false;
И также этот случай внутри кавычек. Объявление bPermCoun2 естесно выносить из
цикла построчного цикла.
По ходу, мы здесь зря тёрки трём - автор уже нашёл решение...
Номер выпуска : 5303
Возраст листа : 950 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/543179
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, Deni_S!
Примерно так я недавно делал в одной программе:
псевдокод int счетчик = 0;
bool счет = истина;
bool комментарий = ложь;
цикл пока(строка_не_кончилась)
{
если(символ = кавычка)
счет = НЕ счет;
если(не_первый_символ)
{
если(символ = / )
{
если((предыдущий_символ = * ) И (комментарий = истина))
комментарий = ложь;
иначе если(предыдущий_символ = / )
прервать_цикл;
}
иначе если(символ = * )
{
если((предыдущий_символ = / ) И (комментарий = ложь))
комментарий = истина;
}
}
если((счет = истина) И (комментарий = ложь))
{
если(символ = ( )
увеличить счетчик;
иначе если(символ = ) )
уменьшить счетчик;
}
если(счетчик меньше нуля)
в_строке_ошибка;
перейти_к_следующему_символу;
}
если(счетчик не равен нулю)
в_строке_ошибка;
С уважением, AleX
Номер выпуска : 5310
Возраст листа : 952 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/543563
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Сильно сомневаюсь, что возможно - хотя бы даже потому, что может быть
и такое выражение:
LowerCase((DateTimeToStr(Now)+")");
Выражение неверно, но пары скобок имеются.
Или
LowerCase(DateTimeToStr(Now)); // )
Выражение верно, но одна скобка лишняя.
Имхо, тут нужно два прохода, даже при подходе без регулярных выражений
- первым исключаем все ненужные скобки (вырезаем текст между каждой
нечётной и чётной кавычками, между символами /* и */ и всё что дальше
//).
- вторым реально считаем. Причём считать лучше всего навстречу - т.е.
сначала находишь открывающую скобку (запоминаешь индекс A), потом
начинаешь с конца, если находишь закрывающую, тоже запоминаешь но в B
и начинаешь опять искать с A. Если в процессе поиска B, ты доходишь до
A или натыкаешся на открывающую скобку - выражение неверно. Цикл
оканчивается положительно, когда при поиске очередной открывающей
скобки, ты доходишь до B, которая с самого начала должна быть равна
длине строки.
Провернуть всё это регулярными - нереально.
Номер выпуска : 5297
Возраст листа : 948 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/542018
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, Neco!
А еще вот такое:
LowerCa)se(DateTim(eToStr(Now));
оно тоже пройдет тест, хотя неверно в принципе.
То есть, если счетчик до конца строки (или до // ) стал меньше нуля, то
строка с ошибкой.
По-моему можно обойтись дополнительной переменной "выключателем":
встретилась " или /* - не учитывать скобки до следующей " или */ .
А символы // можно воспринимать как конец строки.
С уважением, AleX
Номер выпуска : 5300
Возраст листа : 949 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/542702
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Привет AleX,
Ты мне в письме от 27 апреля 2006 г. (четверг) вон шо набрал
И я немного попишу:
Господа, помоему тут надо копать в сторону создания трансляторов.
Создаем описание выражений (языка) в расширенной форме Бекуса-Наура и
пишем трех-шаговый транслятор (лексический анализатор, синтаксический
анализатор и модуль выполнения). Который и решает все проблемы
правильного синтаксиса выражений.
Афоризм 1: Жизнь хитра! Когда у меня на руках все карты - она внезапно решает
играть в шахматы...
Афоризм 2: Основная ошибка в жизни - предположение о том, что люди действуют
на основе мыслительных процессов..
28 апреля 2006 г. 19:34:50
Работник мышки и клавиатуры,
просто студент и САПРист
Eugene the Monster
E-mail: mailto:rav***@o*****.ru
ICQ: 291-819-230
Web: www.hallo.nm.ru
Номер выпуска : 5305
Возраст листа : 951 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/543236
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, VITO!
Например так:
Счетчик = 0.
Читать по одному символу, слева направо.
Если символ - открывающая скобка, увеличить счетчик на 1.
Если символ - закрывающая скобка, уменьшить счетчик на 1.
Если в конце строки счетчик равен нулю - все правильно.
Если в конце строки счетчик больше нуля - не все скобки закрыты.
Если в конце строки счетчик меньше нуля - закрывающих больше.
С уважением, AleX
Номер выпуска : 5296
Возраст листа : 948 (дней)
Количество подписчиков : 544
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/541829
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru