我为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解析器如何处理调用语句?
答案 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