Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.07;
Скачать: CL | DM;

Вниз

CheckBrackets() на Pascal   Найти похожие ветки 

 
Несусвет   (2014-02-04 18:52) [0]

Есть строка. В ней записано математическое выражение.
Нужно проверить правильность скобок.

Когда я делал эту функцию, то найденную пару скобок выкидывал из строки, но чувствую есть другой способ, может быть через рекурсию.


 
Inovet ©   (2014-02-04 19:12) [1]


if s[i] = "(" then
 inc©
else if s[i] = ")" then
 dec©
if c <> 0 then
 writeln("Error")


 
Inovet ©   (2014-02-04 19:13) [2]

> ©

Автозамена вредит
(с)


 
Слава Пестов1   (2014-02-04 19:19) [3]


> Inovet ©   (04.02.14 19:12) [1]
>
>
> if s[i] = "(" then
>  inc©
> else if s[i] = ")" then
>  dec©
> if c <> 0 then
>  writeln("Error")


1)а если первая скобка в выражении будет ")"
2)а если ")число"

Я ж Фактор писал, я в курсе дела.


 
Rouse_ ©   (2014-02-04 19:41) [4]

Зачем рекурсия? Стека хватит (но только для проверки открывающих-закрывающих, а не правильности всей записи, к примеру вот такая будет неверна "(А+) В").
Нашлась открывающая - push
Закрывающая - pop
pop - на пустом стеке выдаст ошибку.


 
Несусвет   (2014-02-04 19:47) [5]


> Rouse_ ©   (04.02.14 19:41) [4]


Не понял о чём вы.


 
Rouse_ ©   (2014-02-04 19:54) [6]


> Несусвет   (04.02.14 19:47) [5]


Грубо, если взять вариант от Inovet, то:

c := 0;
for i := 1 to Lenght(s) do
begin
 if s[i] = "(" then
   inc(с) // push
 else if s[i] = ")" then
   dec(с); // pop
 if c < 0 then
   raise Exception.Create("Закрывающая скобка не на своем месте");
end;
if c <> 0 then
raise Exception.CreateFmt("Обнаружено %d не закрытых открывающих скобок", [c]);


 
Inovet ©   (2014-02-04 20:02) [7]

> [3] Слава Пестов1   (04.02.14 19:19)
> 1)а если первая скобка в выражении будет &laquo;)&raquo;
> 2)а если &laquo;)число&raquo;

Ну и что, проверке парности скобок это как повредит.


 
Стенка ©   (2014-02-04 20:55) [8]

> Inovet ©   (04.02.14 19:12) [1]

loop
 if s[i] = "(" then inc©
 else if s[i] = ")" then if ©>0 then dec© else break
endloop

if c <> 0 then
 writeln("Error")


 
Стенка ©   (2014-02-04 20:58) [9]

в [8] вкралась ошибка

loop
 if s[i] = "(" then inc©;
 else if s[i] = ")" then begin;
   dec©;
   if ©<0 then break;
 end;
endloop

if c <> 0 then
 writeln("Error")


 
Inovet ©   (2014-02-04 21:00) [10]

Ну да, надо в цикле проверять на минус.


 
а в гугл заглянуть?   (2014-02-04 21:08) [11]

можно заодно и остальное проверить, не только скобки:
http://www.rsdn.ru/article/alg/statemachine.xml
(прокрутить до второго примера)


 
Inovet ©   (2014-02-04 21:16) [12]

Ну а почему нормальный парсер не сделать и пусть целиком разбирает.


 
icWasya ©   (2014-02-05 13:22) [13]

Inovet ©   (04.02.14 21:16) [12]
>Ну а почему нормальный парсер не сделать и пусть целиком разбирает.
Ну так вот, что бы не гонять понапрасну парсер, перварительно можно проверить парность скобок.


 
DVM ©   (2014-02-05 13:33) [14]

Имхо, говорить о правильности расстановки скобок в выражении бессмысленно в отрыва от синтаксического и наверное даже семантического анализа данного выражения. Можно проверить лишь парность их.


 
Ega23 ©   (2014-02-05 13:38) [15]


> Имхо, говорить о правильности расстановки скобок в выражении
> бессмысленно в отрыва от синтаксического и наверное даже
> семантического анализа данного выражения. Можно проверить
> лишь парность их.


Плюсую. В строке может быть комментарий, в котором может стоять какая угодно ересь.


 
Юрий Зотов ©   (2014-02-05 14:55) [16]

(15+)3


 
Jeer ©   (2014-02-05 14:56) [17]

Сначала нужно проверить ересь, а правда - она потом всплывет..или утонет.


 
Ega23 ©   (2014-02-05 15:10) [18]


> Сначала нужно проверить ересь, а правда - она потом всплывет.
> .или утонет.


Надо AST построить. Потом валидировать его. Потом - вычислить. Валидирование и вычисление можно совместить, от задачи зависит.


 
Inovet ©   (2014-02-05 15:23) [19]

> [16] Юрий Зотов ©   (05.02.14 14:55)
> (15+)3

Да такого дофига может быть. И превратится проверка парности в парсер.


 
Слава Пестов1   (2014-02-05 15:41) [20]


> Юрий Зотов ©   (05.02.14 14:55) [16]
>
> (15+)3



> Слава Пестов1   (04.02.14 19:19) [3]
> 1)а если первая скобка в выражении будет ")"
> 2)а если ")число"


 
Юрий Зотов ©   (2014-02-05 16:18) [21]

> > Inovet ©   (05.02.14 15:23) [19]
> > Слава Пестов1   (05.02.14 15:41) [20]


Совершенно верно. Я к тому и привел такой пример, чтобы подтвердить [14] -   никакой практической ценности проверка парности скобок сама по себе не имеет.



Страницы: 1 вся ветка

Текущий архив: 2014.09.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
15-1391518862
FizzBazz
2014-02-04 17:01
2014.09.07
Ваш вариант реализации FizzBuzz на Delphi?


2-1381782438
Marina1990
2013-10-15 00:27
2014.09.07
TreeView выделить программно нужный нод


15-1391170614
Несусвет
2014-01-31 16:16
2014.09.07
Как мобилизовать себя?


15-1391468915
Кузьмич
2014-02-04 03:08
2014.09.07
Ищу табличку!


15-1391083853
stas
2014-01-30 16:10
2014.09.07
прочитать прошивку контроллера