26.08.2013 / 11:56 | |
SeTSeR Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| aNNiMON, Код? Да пожалуйста, мне не жалко: public void skipComment()
{
while(Look!='}')
{
if(Look=='{') skipComment()
getChar();
}
}
|
26.08.2013 / 11:57 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| SeTSeR, совет? Да пожалуйста, мне не жалко: Рекурсия зачастую заменяется циклом.
__________________
let live |
26.08.2013 / 12:04 | |
SeTSeR Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| aNNiMON, В данном случае не получится, т. к. если вложить skipComment в цикл, то будут обрабаываться комментарии, идущие подряд, а мне нужна обработка вложенных
|
26.08.2013 / 12:12 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| public void skipComment() {
do {
boolean skip = false;
while ( (Look != '}') && !skip ) {
if (Look == '{') skip = true;
getChar();
}
} while (skip);
}
Что происходит. Допустим у нас строка "{ ololo }". По первому символу { я так понимаю, мы попадаем в этот метод skipComment() из какого-то другого метода. Считывается комментарий и, когда приходит символ } внутренний цикл перестаёт выполняться, а поскольку skip при этом равен false, то и внешний цикл тоже не повторяется. Получается do/while выполняется один раз. Допустим, у нас строка "{ olo { ololo }". Не знаю, зачем так было извращаться, ведь комментарий строго должен начинатся с { и заканчиваться на }, то что там может быть дофига { не должно никак влиять на парсер (или что там у тебя). Но раз уж задача стоит так ""Я знаю, зачем это сделано.", то продолжим: Попали в skipComment при {. Далее считывается olo и потом опять приходит {. skip устанавливается в true, внутренний цикл обрывается. А внешний цикл продолжает работу еще один раз. Продолжаем читать дальше. ololo прошло, приходит }. Внутренний цикл заканчивает свою работу и внешний тоже, потому что на этот раз skip равен false. __________________
let live Изменено aNNiMON (26.08 / 12:13) (всего 1 раз) |
26.08.2013 / 12:16 | |
SeTSeR Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| aNNiMON, [офф]насчёт парсера: да, к парсеу этот метод никакого отношения не имеет. Он вызывается из обработчика пробелов, относящегося к сканеру. И ещё: твой пример немного невалиден. Вложенный комментарий также должен оканчиваться на '}'[/офф] А за код спасибо.
Изменено SeTSeR (26.08 / 12:20) (всего 2 раза) |
26.08.2013 / 12:25 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| SeTSeR (26.08.2013/12:16)Вложенный комментарий также должен оканчиваться на '}'Ключевое слово "комментарий". Зачем усложнять жизнь себе и людям? Комментарий, он ведь и в Африке комментарий: {{{{{{пишу скобки, сколько хочу{{{{{{{{{{{{{{ и тут бац} а не {{{{{{пишу скобки, сколько хочу{{{{{{{{{{{{{{ и тут бац} ой, не бацнулось}}}}}} еще давай }}} блин, надо посчитать сколько еще осталось }}}} я ненавижу автора!!!}}}}}}}}}}}}}}}Ну коли "Я знаю, зачем это сделано.", тогда делай парсер (или сканер или что ты там вообще делаешь) со счетчиком, чтобы усложнить жизнь юзеру считать количество входных { и выходных }. При countBrackets == 0 вложенные комментарии валидны. При countBrackets < 0 - не хватает закрывающей }, при > 0 - открывающей {. Ну, думаю, это и так очевидно.
__________________
let live Изменено aNNiMON (26.08 / 12:29) (всего 1 раз) |
26.08.2013 / 12:45 | |
SeTSeR Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| aNNiMON, проще стек заюзать А ещё проще - метки. Изменено SeTSeR (26.08 / 12:48) (всего 1 раз) |
26.08.2013 / 13:53 | |
gost6678 Пользователь
| Комментарии почти во всех языках пишут после двух слешов, вот так: //комментарий.
|
26.08.2013 / 14:28 | |
RGT Пользователь Сейчас: Offline
Имя: Snork Откуда: Yerevan Регистрация: 03.02.2010
| gost6678 (26.08.2013/13:53)Комментарии почти во всех языках пишут после двух слешов, вот так: //комментарий.Doxygen-style: //< //! //@type
XML-style: ///<tag></tag>
Multistring: /* */
Bash: #
asm (некоторые): ;
__________________
don't tread on me |
26.08.2013 / 14:31 | |
SeTSeR Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| RGT, pascal: (* *) TP: {} Ada: --+CR(LF)
Изменено SeTSeR (26.08 / 14:33) (всего 1 раз) |