【问题标题】:JFlex Lexer that distinguishes "Class brackets" and "Method bracket"区分“类括号”和“方法括号”的 JFlex Lexer
【发布时间】:2016-11-24 00:33:57
【问题描述】:

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

【问题讨论】:

    标签: java compiler-construction token lexer jflex


    【解决方案1】:

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

    它们在词汇上没有什么不同。 "{".equals("{")。您区分它们的方式是通过解析器中的上下文。词法分析器无法区分,也不应该。

    另外我如何区分方法应用和变量标识符

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

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

    【讨论】:

    • 感谢您的澄清。是否有任何现有的示例代码或工具可以修改以我的方式解析代码?
    • @Y.Zhao 有各种解析器组合器的示例 Java 语法,但我找不到与 JFlex 一起使用的当前语法。我不认为 JFlex+Cup 或 JFlex+BYaccJ 或流行的组合不再(如果它们曾经是的话)。如果您没有与 JFlex 结婚,您应该很容易找到适用于 Antlr 的当前 Java 语法。
    猜你喜欢
    • 2019-02-22
    • 2022-11-19
    • 2012-11-12
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多