2016-11-24 90 views
0

我需要爲java源代碼抄襲檢測器編寫一個詞法分析器。 這是我想要實現的一個例子。JFlex Lexer區分「類括號」和「方法括號」

//Java code         Tokens: 
public class Count {       Begin Class 
    public static void main(String[] args) Var Def, Begin Method 
     throws java.io.IOException { 
     int count = 0;       Var Def, Assign 
     while (System.in.read() != -1)   Apply, Begin While 
     count++;        Assign, End While 
     System.out.println(count+" chars."); Apply 

    }           End Method 
}            End Class 

我認爲Jflex是生成詞法分析器的正確工具。然而在看過一些例子之後。我無法找到區分類括號和方括號的方法。我發現大多數分化器只是將它們識別爲相同的標記。另外我如何區分一個方法適用於變量標識符?

回答

4

我找不到方法區分類括號和方法括號。

他們沒有什麼詞彙上的不同。 "{".equals("{")。您在分析器中通過上下文區分它們的方式。詞法分析器不能做出區分,也不應該這樣做。

而且我怎麼區分的方法從一個變量標識符

在詞法分析器應用,你不知道。標識符是一個標識符。從「f(x)」生成的令牌流應爲Identifier, OpeningParenthesis, Identifier, ClosingParenthesis

現在,在解析器中,您將通過後面帶有開頭括號的事實來識別函數名稱,但這又是解析器的工作,而不是詞法分析器的工作。

+0

感謝您的澄清。是否有任何現有的示例代碼或工具可以修改以我的方式解析代碼? –

+0

@ Y.Zhao有各種解析器組合器的Java語法示例,但是我無法找到與JFlex一起使用的Java語法。我不認爲JFlex + Cup或JFlex + BYaccJ或流行組合(如果他們曾經是)。如果你沒有和JFlex結婚,你應該很容易找到Antlr的Java語法。 – sepp2k