2010-01-25 27 views
1

我正在爲CS課程開展反剽竊項目。這涉及通過所描述的技術檢測計算機科學課程(編程作業)中的剽竊。基本上,我正在進行一組編程任務。比方說,在任務之一是這樣的:如何在變換中跟蹤字符串中的原始字符位置?

public class MyClass 
{ 
    public static void main(String[] args) 
    { 
     // declare a variable called someVar 
     int someVar = 0; 
    } 
} 

這就需要打通前端運行,詞法分析部分剝離出來,我們不想要的代碼的功能。在這種情況下,我想要將所有標識符名稱重命名爲常量「V」,並從代碼中將所有註釋全部重命名。

要做到這一點,我們將使用ANTLR和現有的語法各種語言生成相應的詞法分析器。

最終的結果是這樣的:

public class V 
{ 
    public static void V(String[] V) 
    { 
     int V = 0; 
    } 
} 

然後我們去除所有的空白得到:然後

publicclassV{publicstaticvoidV(String[]V){intV=0;}} 

這個字符串被分解成K-克預設的大小。例如說K = 5(實際上這將是更大的):

publi ublic blicc liccl iccla ... =0;}} 

這裏的問題是:

每個k克被散列與滾動散列函數,並假定要記錄與他們的源文本中的原始字符位置。 k-gram散列和字符位置一起形成指紋。

我怎麼可以跟蹤跨越的標識,評論和白色空間中的所有前端剝離源文本中的K-克原來的位置?

這對於你突出的比賽中對原始出處文本文檔的程序的最後階段是必不可少的。爲了突出k-gram哈希值的匹配,我需要知道k-gram從哪裏開始並在原始源中結束。

+0

另請參閱此類似的問題:http://stackoverflow.com/questions/2303924/how-can-i-keep-track-of-character-positions-after-i-remove-elements-from-a-string – Miles 2010-02-27 08:08:19

回答

1

ANTLR詞法分析器跟蹤源流中的標記位置。

  • 移動註釋和空白的隱藏通道
  • 集標識符標記的Text屬性爲「V」
  • 運行您滾動哈希針對CommonTokenStream,看着每個令牌的Text財產。

由於能夠最終從開始完整的標記,你必須映射保存爲好。

0

嘿,爲什麼使用此步驟:

此字符串然後分解成K-克預設大小的。例如,說k = 5(實際上它會更大): publi ublic blicc liccl iccla ...= 0;}}

我的意思是爲什麼這是抄襲檢測所需?

+1

閱讀我上面給出的PDF鏈接。基本上,通過將源代碼拆分爲k-gram並散列它們,您可以檢測文檔之間的匹配,儘管重新排序和空白。 – mmcdole 2010-02-27 18:17:18

相關問題