区分“类括号”和“方法括号”的java JFlex Lexer
我需要为java源代码剽窃检测器编写一个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是生成lexer的正确工具。然而,在看了一些例子之后。我找不到区分类括号和方法括号的方法。我发现的大多数标记化者只是将它们识别为相同的标记。另外,如何区分方法应用和变量标识符
# 1 楼答案
它们在词汇上没有什么不同
"{".equals("{")
。区分它们的方式是通过解析器中的上下文。lexer不能做出这种区分,也不应该在lexer中,你没有。标识符就是标识符。从“f(x)”生成的令牌流应该是
Identifier, OpeningParenthesis, Identifier, ClosingParenthesis
现在,在解析器中,您将通过以下事实来识别函数名:它后面有一个开括号,但这同样是解析器的工作,而不是词法分析器的工作