一位朋友让我看这个页面,并注意到一个论坛用户的签名中有一段奇怪的代码。
该代码是一个单行代码,如下所示:
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 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 Local Error
可以简化为On Error
- 乍一看,嵌套转换并没有什么特别的意义,但事实证明,用简单的转换和比较系列替换
Debug.Assert True
会使代码始终编译,因此其中的某些东西会弄乱编译器。 - 如果粘贴代码,则编译;如果
Local
在 VBE 验证该行之后以任何方式对其进行了修改(甚至只是删除),它会停止编译,并且似乎没有任何东西可以让 VBA 再理解它,除非该行被删除并重新粘贴。 - 最新的橡皮鸭语法/解析器密切模仿实际的 VBA 规范,它解析和解析得很好(老实说,这让我大吃一惊)
- 如果已知该行无法编译,然后剪切/重新粘贴,它不会编译......但从 VBE 外部再次重新粘贴它,它会突然编译。
问题是,这段代码如何根据 VB 语言规范进行编译?它是 VB[6|A|E] 实现中的错误吗?换句话说,它为什么/如何工作?
我认为它与指令分隔符 ( :
) 和 inline-if 语法有关 - 鉴于没有End If
语句,它是单行而不是块。
但是,是什么让那个特定的代码成为薛定谔的代码?是什么让它既合法又非法?
如果代码被使用正式语法定义(ANTLR)生成的解析器正确解析,那么它一定是合法的构造吗?那么,当您只是回到那条线并按 ENTER 时,为什么它不再合法?