Почему этот код компилируется при вставке, но в противном случае происходит сбой?

Друг заставил меня взглянуть наэта страниц и заметил странный кусок кода в подписи одного из пользователей форума.

Код состоит из одной строки, которая выглядит следующим образом:

On Local Error Resume Next: If Not Empty Is Nothing Then Do While Null: ReDim i(True To False) As Currency: Loop: Else Debug.Assert CCur(CLng(CInt(CBool(False Imp True Xor False Eqv True)))): Stop: On Local Error GoTo 0

Прокрутка удалена:

On Локальная ошибка Возобновить Далее: Если не пусто, то ничего не значит, тогда делайте пока Null: ReDim i (True To False) в качестве валюты: Loop: Else Debug.Assert CCur (CLng (CInt (CBool (False Imp True), X False Eqv True)) )): Стоп: при локальной ошибке GoTo 0

Довольно умопомрачительно, этот код компилируется (я не пытался его запустить, но это не имеет значения), если вы просто вставляете его как есть (а затем не трогаете его снова!) В допустимую область действия уровня процедуры.

Некоторые наблюдения:

Если разделители / двоеточия команд заменены новыми строками, они больше не компилируютсOn Local Error можно упростить доOn Error Вложенные преобразования на первый взгляд не представляют особого интереса, но оказывается, что заменить эту серию преобразований и сравнений простымDebug.Assert True делает код постоянно компилируемым, поэтомучто-т там портится компилятор. Если код вставлен, он компилируется; если он изменен каким-либо образом (даже просто удаляяLocal) после того, как VBE проверил строку, она перестает компилироваться, и кажется, что VBA больше ничего не понимает, если строка не удалена и не вставлена повторнПоследнийрезиновая утк грамматика / синтаксический анализатор тесно моделируются на основе реальных спецификаций VBA, разбирает и решает просто отлично (честно говоря, поражает воображение) Если известно, что строка не компилируется, а затем вырезается / повторно вставляется, она не компилируется ... но ее повторная вставка из-за пределов VBE происходит внезапно, @ она компилируется.

Вопрос в то Как этот код компилируется в соответствии со спецификациями языка VB? Это ошибка в реализации VB [6 | A | E]? Другими словами, почему / как это работает?

I считат это как-то связано с разделителем команд :) и встроенный синтаксис if - если нетEnd If утверждение, вещьявляетс одна строка, а не блок.

Но тогда, что делает этот конкретный код быть кодом Шредингера? Что делает его одновременно и легальным, и нелегальным?

Если код правильно анализируется синтаксическим анализатором, сгенерированным с использованием формального определения грамматики (ANTLR), то это должна быть допустимая конструкция? Тогда почему это перестает быть законным, когда вы просто возвращаетесь к этой строке и нажимаете ENTER?

Ответы на вопрос(2)

Ваш ответ на вопрос