VBScript括号表达式是如何命名/解析的?

时间:2016-09-28 21:21:50

标签: vbscript

我为VBScript解析器构建AST格式。现在我需要在AST中添加一个格式,指示" MemberExpression",其中一个对象被索引一个引用其属性的值,例如:

' member expression
( object.prop )
' computed member expression
( object("prop") )

对象通常可以使用 . 进行索引,但我的混淆是使用 (...) 进行计算索引,因为:

  • 子/函数的可选参数列表可以用括号括起来( function(argList) )。注意:我知道参数列表不需要用括号括起来。

如果我将任何括号表达式视为计算成员表达式,如果子/函数调用包含括号括起的 argList ,则会出错,例如:

Sub fnc(msg)
    MsgBox msg:::
End Sub

fnc("Hello") ' this call statement will be treated as member expression
' but should be treated as a call statement

所以,我真正的问题是:VBScript解析器是否需要知道 fnc 是一个函数/ sub来设置其适当的AST格式?原始VBScript解析器如何处理调用语句?

2 个答案:

答案 0 :(得分:3)

没有他,Eric的工作就可以使用。

  

这是交易:括号表示VB中的几个不同的东西,因此在VBScript中。他们的意思是:

     

1)在表达式的其余部分之前评估子表达式:Average =(First + Last)/ 2

     

2)取消引用数组的索引:Item = MyArray(Index)

     

3)调用函数或子程序:Limit = UBound(MyArray)

     

4)传递一个通常为byref为asval的参数:Result = MyFunction(Arg1,(Arg2))'Arg1传递给参数,arg2传递给视频

     

这已经足够混乱了。不幸的是,VB和VBScript在#3适用的时候有一些奇怪的规则。规则是

     

3.1)具有赋值给返回值的函数调用的参数列表必须由parens包围:Result = MyFunc(MyArg)

     

3.2)使用Call关键字的子程序调用(或没有赋值的函数调用)的参数列表必须被parens包围:Call MySub(MyArg)

     

3.3)如果3.1和3.2不适用,则列表不得被parens包围。

来自https://blogs.msdn.microsoft.com/ericlippert/2003/09/15/what-do-you-mean-cannot-use-parentheses/

答案 1 :(得分:1)

没有

' computed member expression
( object("prop") )
在VBScript中

。证据:

Option Explicit

Class c
  Dim p
End Class

Dim d : Set d = CreateObject("Scripting.Dictionary")
d("p") = "quoted key name works for dictionary"
WScript.Echo d("p")

Dim o : Set o = New c
o.p = ". prop name works for object"
WScript.Echo o.p
Dim s : s = "quoted prop name does not work for object"
On Error Resume Next
  o("p") = s
  WScript.Echo Err.Description
On Error GoTo 0
WScript.Echo s

输出:

cscript 39757881.vbs
quoted key name works for dictionary
. prop name works for object
Object doesn't support this property or method
quoted prop name does not work for object