我正在做一个语义分析器,我需要知道代码中何时有函数。我知道函数以id开头,后来有一个'(' 因此,在我的元素数组中,我有这个:
Set Rng = Range("B36:B360")
For Each cll In Rng
If cll.Row < Today And cll.Value <> "" And cll.Font.Color = vbBlack Then
If Range("B22") = "" Then
Range("B22") = cll
Else
Range("B23") = cll
End If
所有'id'后跟'('是函数。因此,我需要查找所有这些出现。是否有某种方法可以找到所有这些'id'和'('以便对其进行计数?
并非所有代码都完全相同,有些则更大。
我很想尝试使用if和
['id', '(', ')', '{', 'id', '(', 'lit-str', ')', ';', 'id', '(', 'lit-str', ')', ';', 'id', '(', '!', 'lit-int', ')', ';', 'id', '(', ')', ';', '}']
但这只算第一次出现。
答案 0 :(得分:0)
您只需在列表中重复即可。一个更复杂的解决方案是使用正则表达式。
根据问题的提出,for
循环看起来是最简单的解决方案。您需要同时迭代2个元素。
在这里,一个简单的解决方案返回一个索引列表,其中元素id
后跟一个以(
开头的元素:
# Your input data
input_list = ['id', '(', ')', '{', 'id', '(', 'lit-str', ')', ';', 'id', '(', 'lit-str', ')',
';', 'id', '(', '!', 'lit-int', ')', ';', 'id', '(', ')', ';', '}']
def getFunction(input_list):
# List that will collect the index of 'id' followed by '('
index_list = []
print(input_list)
for i, mot in enumerate(input_list[:-1]):
# Also check if input_list[i+1] is defined
if mot == 'id' and input_list[i+1] and input_list[i+1][0] == '(':
index_list.append(i)
return index_list
print(getFunction(input_list))
# [0, 4, 9, 14, 20]
希望有帮助!
答案 1 :(得分:0)
如果我理解您所说的问题,我会像这样使用列表的压缩形式:https://stackoverflow.com/a/21303286/2860127
num_functions = 0
for left_token, right_token in zip(tokens, tokens[1:]):
if left_token == "id" and right_token == "(":
num_functions += 1
print("I found {} function calls/definitions.".format(num_functions))
尽管这取决于您如何实现语义分析器;一个更全面的系统将需要使用当前令牌中的索引,例如Alexandre B.所拥有的。
我不同意Alexandre B.和Green Cloak Guy的看法-正则表达式适用于 parser ,这是语义分析之前编译器的步骤,它可以弄清输入中的“单词”是什么(例如,将特定名称“ foo”转换为“ id”)。
另一方面,语义分析需要确保输入符合语言的语法,这是上下文无关的语法,因此我们需要比正则表达式更强的东西。递归可能是实现此目的的好方法。