2013-04-21 29 views
1

我正在使用自定义脚本来自动执行这些过程。 (其实学习)。这是剧本。在脚本中检测未声明的变量

var a = 5; 
var b = 55; 

return a+b; 

我只是将源代码转换为C#并使用CSharpCodeProvider类编译它。我目前正在转换成令牌,这里是我的令牌枚举

public enum Tokens 
{ 
    RETURN, 
    NEWLINE, 
    WHITESPACE, 
    VAR, 
    WORD, 
    SYMBOL, 
    INTEGER 
} 

和我顺利拿到这些令牌

VAR, WHITESPACE, WORD, WHITESPACE, INTEGER, SYMBOL 
NEWLINE, 
VAR, WHITESPACE, WORD, WHITESPACE, INTEGER, SYMBOL 
NEWLINE 
NEWLINE 
RETURN, WHITESPACE, WORD, SYMBOL, WORD, SYMBOL 

我正在试图找到未声明的变量,并宣布他们自己。我已经尝试将每个WORD添加到变量列表并将其添加到脚本,但它会得到重复的声明。

我想这也验证

a = 5; 
var b = 55; 

return a+b; 

即只加了东西的声明没有var关键字。

我该如何解决这个问题?

谢谢。

编辑:

这里是我如何解析源。

List<Token> tokensList; 
List<string> variables; 

for (int i=0; i<tokensList.Count; i++) 
{ 
    Token token = tokensList[i]; 

    switch (token.TokenType) 
    { 
     case WORD: 
      variables.Add(token.Value); 
      break; 
    } 
    result.Append(token.Value); 
} 
+0

你说的未声明的变量是什么意思?脚本中的所有变量都被声明。 – devdigital 2013-04-21 10:13:06

+0

只是想获得这种情况。 – 2013-04-21 10:13:45

+0

使用不同来删除重复? – Vincenzo 2013-04-21 10:16:32

回答

0

可以声明“结果”作为字典(=散列),而不是一个列表,

在这种情况下它不能有重复

另外, 取代:

result.Append(token.Value); 

有:

if (!result.Contains(token.Value)) 
     result.Append(token.Value); 
+0

是的。结果是一个StringBuilder对象。我不想在添加var关键字后添加变量。 – 2013-04-21 10:36:15

+0

嗨,如果你将它定义为一个字符串,这种语法(.Contains)将工作相同,并将没有重复。 – Wasafa1 2013-04-21 10:37:51