Коллеги! Пишу простенький интерпретатор языка... Впрочем "язык" это слишком громко сказано — очень-очень простенькие скриптики. Тупо двигаемся по строкам файла и выполняем команды одну за другой... ОЧЕНЬ простой язык, в общем.
И столкнулся с проблемой. В моем "языке" есть конструкция IF-ENDIF. Когда интерпретатор доходит до инструкции IF- он проверяет условие, если истинно — идем дальше, если ложно — проскакиваем до ENDIF. Все как обычно. Никаких ELSE нет.
И я второй час не могу допетрить, как обрабатывать вложенные блоки этих IF'ов. Уверен, что решение очень простое и даже общеизвестное, помогите, а?
Пока придумал вот такой алгоритм:
— В переменной iNestLevel (int) храним текущую вложенность.
— Когда в коде встречается инструкция IF прибавляем к iNestLevel один, когда натыкаемся на ENDIF — отнимаем один.
— если мы встретили ложное условие в IF — мы "запоминаем" текущий iNestLevel в переменной iNestLevelToSkip (если она не 0)
— на каждой команде проверяем — если (iNestLevel > iNestLevelToSkip && iNestLevelToSkip>0 ) то команду пропускаем — переходим к следующей.
— когда доходим до ENDIF, после того как уменьшили iNestLevel, проверяем: если (iNestLevel==iNestLevelToSkip) то обнуляем iNestLevelToSkip.
будет такое работать? чуствую есть заковыка, а где — не пойму... Кофе и сигареты кончаются...
заранее снкс.
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