我正在构建一个JSON递归下降解析器,我遇到了一些有点烦人的情况。
使用Select Case语句来确定接下来需要解析的内容通常很方便,但偶尔需要将字符的类用作标准。 有没有办法将布尔函数作为条件语句中的条件包含? 或者,更一般地说,是否可以在Case语句中包含一个布尔条件而不依赖于与选择Case变量?我担心这是一个全有或全无的命题,我将不得不为If_Then-ElseIf-Else-End_If的罗嗦海洋改变精美简洁的Select Case语句。
这很好用:
Select Case curr_char
Case "{"
'Parse an Object
Case "["
'Parse an Array
Case Else
'Parser Error
End Select
但假设我有一个函数Private Function isAlpha(str As String) As Boolean
。这不起作用,因为IsAlpha
,True
/ False
的结果与curr_char
的值进行了比较:
Select Case curr_char
Case IsAlpha(curr_char)
MsgBox "It's alpha!"
Case "{"
'Parse an Object
Case "["
'Parse an Array
Case Else
'Parser Error
End Select
为了避免改变现有代码的结构,我使用了丑陋,hacky,kludgy:
Select Case True
Case IsAlpha(curr_char)
MsgBox "It's alpha!"
Case curr_char = "{"
'Parse an Object
Case curr_char = "["
'Parse an Array
Case Else
'Parser Error
End Select
答案 0 :(得分:1)
我认为您可以使用评估curr_char
的中间函数执行您想要的操作,并将Select Case
基于该函数的返回值。
Select Case Categorize(curr_char)
Case "isAlpha = True"
MsgBox "It's alpha!"
Case "{"
'Parse an Object
Case "["
'Parse an Array
Case Else
'Parser Error
End Select
Public Function Categorize(ByVal pChar As String) As String
Dim strReturn As String
If isAlpha(pChar) Then
strReturn = "isAlpha = True"
Else
strReturn = pChar
End If
Categorize = strReturn
End Function
我认为这符合您描述的要求,但不确定我有多喜欢它。如果你说“哎呀!”我就不会被冒犯。
但是,这种方法是可扩展的。您可以调整Categorize()
来处理其他函数,然后扩展Select Case
。
Case "SomeOtherFunction = True"