区分 "Class brackets" 和 "Method bracket" 的 JFlex Lexer

JFlex Lexer that distinguishes "Class brackets" and "Method bracket"

我需要为 java 源代码抄袭检测器编写词法分析器。 这是我想要实现的示例。

//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 是生成词法分析器的正确工具。但是,在查看了一些示例之后。我找不到区分 class 括号和方法括号的方法。我发现的大多数标记器只是将它们识别为相同的标记。另外,如何区分应用方法和变量标识符?

I cannot find a way to distinguish class brackets and method brackets.

它们在词汇上没有什么不同。 "{".equals("{")。区分它们的方法是在解析器 中根据上下文。词法分析器无法做出这种区分,也不应该。

Also how do I distinguish a method apply from a variable identifier

在词法分析器中,您不需要。标识符是标识符。从 "f(x)" 生成的令牌流应该是 Identifier, OpeningParenthesis, Identifier, ClosingParenthesis.

现在在解析器中,您将通过函数名称后跟一个左括号来识别函数名称,但同样这是解析器的工作,而不是词法分析器的工作。