Форум: "Прочее";
Текущий архив: 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)а если первая скобка в выражении будет «)»
> 2)а если «)число»
Ну и что, проверке парности скобок это как повредит.
← →
Стенка © (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