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

如何命名/解析VBScript括号表达式?,vbscript,Vbscript,我正在为VBScript解析器构建AST格式。现在,我需要向AST添加一种表示“MemberExpression”的格式,其中一个对象使用一个引用其属性的值进行索引,例如: ' member expression ( object.prop ) ' computed member expression ( object("prop") ) 一个对象通常可以用索引,但我的困惑在于用(…)计算索引,因为: sub/函数的可选参数列表可以用括号括起来(函数(argList))。注意:我知道参数列表

我正在为VBScript解析器构建AST格式。现在,我需要向AST添加一种表示“MemberExpression”的格式,其中一个对象使用一个引用其属性的值进行索引,例如:

' member expression
( object.prop )
' computed member expression
( object("prop") )
一个对象通常可以用
索引,但我的困惑在于用
(…)
计算索引,因为:

  • sub/函数的可选参数列表可以用括号括起来(
    函数(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
是设置其适当AST格式的函数/子函数?最初的VBScript解析器是如何处理call语句的?

Eric的工作没有他也可以完成

事情是这样的:括号在VB和VBScript中都有不同的含义。他们的意思是:

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

2) 取消对数组索引的引用:项=MyArray(索引)

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

4) 将通常为byref的参数作为byval传递:Result=MyFunction(Arg1,(Arg2))'Arg1通过byref传递,Arg2通过val传递

这已经够令人困惑的了。不幸的是,VB和VBScript对何时应用#3有一些奇怪的规则。规则是

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

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

3.3)如果第3.1条和第3.2条不适用,则该清单不得用括号括起来

中没有

' 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

可能你需要使用?如果不行,你什么时候需要他???@Lankymart我不认识这个人,err@TheProHandsLankymart评论将发送给eric,以便他知道这个问题的存在。他是最后一个在VBS代码库中编写任何重要内容的程序员。@Lakes:那是很久很久以前的事了。:-)@VBScript是一种很难正确解析的语言。如果您想在解析器中测试角落案例,我在2005年对一些更奇怪的案例做了一个愚蠢的小测试。答案从这里开始:这回答了我的问题,但是我仍然不确定如何命名括号表达式,你有一个简短的想法吗?我不理解你的问题
object(“prop”)
通常是一个集合(在这种情况下,它应该是复数-objects),使用集合的默认属性-
并请求名为
prop
的东西。是的,但是。。。如果它是一个集合索引,我不能命名
func(args)
一个集合索引,因为
func
是一个子/函数,正在被调用。我们在这里编程不做概念性的工作。这是一个概念网站-这是VBS 99.9%基于的VBA规范。但在我的示例中,
object
实际上是一个脚本字典,我忘了提到这一点。我不熟悉VBScript语言,我不太熟悉VBScript上的所有内容。我从你的答案中学到了一些东西,但是它与括号的解析或处理方式无关,例如,如何解析
function():
parsed(这是一个带有括号括起来的参数列表的调用)?它是一个函数,因此必须有一个返回变量来分配它。这就是VBScript将要做的。它是不明确的,所以VBS总是假定它是一个函数
a=func(a,(b))
它可以告诉so第一个参数byref和第二个byval。这在我的文章的第4点中得到了处理。。。我想我明白了。您试图说
object(“prop”)
是一个正在分配新值的调用,对吗(例如,该调用的返回值可以重新分配)?。请让我知道,没有整条线你就说不出来。