JFlex Lexer区分"类括号"和"方法括号"

时间:2016-11-24 00:33:57

标签: java compiler-construction token lexer jflex

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

1 个答案:

答案 0 :(得分:4)

  

我找不到区分类括号和方法括号的方法。

他们没有任何词汇上的不同。 "{".equals("{")。区分它们的方法是通过解析器中的上下文 。词法分析者不能做出这种区分,也不应该这样做。

  

另外,我如何区分方法apply和变量标识符

在词法分析器中,你没有。标识符是标识符。从“f(x)”生成的令牌流应为Identifier, OpeningParenthesis, Identifier, ClosingParenthesis

现在在解析器中,你会识别一个函数名,因为它后跟一个开括号,但同样是解析器,而不是词法分析器的工作。