Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.09.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
2-1381517161
martinov2014
2013-10-11 22:46
2014.09.07
Adoconnection


2-1381759445
Алла
2013-10-14 18:04
2014.09.07
Событие OnChange


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


11-1254240927
Злобный Ламерюга
2009-09-29 20:15
2014.09.07
Очень хочецца KOL + Borland C++ Builder


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский