Интерпретатор IF блоков - вот ведь задачка...
От: jit  
Дата: 28.12.05 20:12
Оценка:
Коллеги! Пишу простенький интерпретатор языка... Впрочем "язык" это слишком громко сказано — очень-очень простенькие скриптики. Тупо двигаемся по строкам файла и выполняем команды одну за другой... ОЧЕНЬ простой язык, в общем.

И столкнулся с проблемой. В моем "языке" есть конструкция IF-ENDIF. Когда интерпретатор доходит до инструкции IF- он проверяет условие, если истинно — идем дальше, если ложно — проскакиваем до ENDIF. Все как обычно. Никаких ELSE нет.

И я второй час не могу допетрить, как обрабатывать вложенные блоки этих IF'ов. Уверен, что решение очень простое и даже общеизвестное, помогите, а?

Пока придумал вот такой алгоритм:
— В переменной iNestLevel (int) храним текущую вложенность.
— Когда в коде встречается инструкция IF прибавляем к iNestLevel один, когда натыкаемся на ENDIF — отнимаем один.
— если мы встретили ложное условие в IF — мы "запоминаем" текущий iNestLevel в переменной iNestLevelToSkip (если она не 0)
— на каждой команде проверяем — если (iNestLevel > iNestLevelToSkip && iNestLevelToSkip>0 ) то команду пропускаем — переходим к следующей.
— когда доходим до ENDIF, после того как уменьшили iNestLevel, проверяем: если (iNestLevel==iNestLevelToSkip) то обнуляем iNestLevelToSkip.

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

заранее снкс.
Re: Интерпретатор IF блоков - вот ведь задачка...
От: raskin Россия  
Дата: 29.12.05 06:15
Оценка: 2 (1)
jit wrote:
> Пока придумал вот такой алгоритм:
> — В переменной iNestLevel (int) храним текущую вложенность.
> — Когда в коде встречается инструкция IF прибавляем к iNestLevel один,
> когда натыкаемся на ENDIF — отнимаем один.
> — если мы встретили *ложное* условие в IF — мы "запоминаем" текущий
> iNestLevel в переменной iNestLevelToSkip (если она не 0)
> — на *каждой *команде проверяем — если (iNestLevel > iNestLevelToSkip &&
> iNestLevelToSkip>0 ) то команду пропускаем — переходим к следующей.
> — когда доходим до ENDIF, после того как уменьшили iNestLevel,
> проверяем: если (iNestLevel==iNestLevelToSkip) то обнуляем iNestLevelToSkip.
А зачем так сложно? Вроде бы Вам хватает просто хранить число "осталось
найти столько endif". Обычно оно 0, после ложного if — единица, если
положительно, то после любого if увеличивается, после endif уменьшается
и ни одна команда не выполняется.
Posted via RSDN NNTP Server 2.0
Re[2]: Интерпретатор IF блоков - вот ведь задачка...
От: jit  
Дата: 29.12.05 15:30
Оценка:
Здравствуйте, raskin, Вы писали:

R>А зачем так сложно? Вроде бы Вам хватает просто хранить число "осталось

R>найти столько endif". Обычно оно 0, после ложного if — единица, если
R>положительно, то после любого if увеличивается, после endif уменьшается
R>и ни одна команда не выполняется.

Супер. Спасибо. +2. Я — тормоз.
Re: Интерпретатор IF блоков - вот ведь задачка...
От: Аноним  
Дата: 29.12.05 15:32
Оценка:
А ложный IF это по вашему, что такое?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.