2013-04-21 30 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