Главная страница
    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
15-1391413931
DevilDevil
2014-02-03 11:52
2014.09.07
А с каких пор inline-ы заработали?


15-1391423025
Demo
2014-02-03 14:23
2014.09.07
Проверка на nil


15-1391373002
Юрий
2014-02-03 00:30
2014.09.07
С днем рождения ! 3 февраля 2014 понедельник


3-1299005241
moker
2011-03-01 21:47
2014.09.07
IBDatabase и FireBird


15-1391425585
Drowsy
2014-02-03 15:06
2014.09.07
При Run программы в IDE...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский