将Java代码拆分为令牌

将Java代码拆分为令牌,java,parsing,split,Java,Parsing,Split,我需要能够将Java代码拆分为单个标记,其中标记是不依赖于空格的代码字符串 例如,以下Java代码: if (method(a, b).equals("C, C++, Java")) 将分为: ['if', '(', 'method', '(', 'a', ',', 'b', ')', '.', 'equals', '(', '"C, C++, Java"', ')', ')'] 基本上,我需要一个可以(取消)填充空格的令牌列表,而不改变代码的执行。如果我以前面的代码为例,我可以在标记周围

我需要能够将Java代码拆分为单个标记,其中标记是不依赖于空格的代码字符串

例如,以下Java代码:

if (method(a, b).equals("C, C++, Java"))
将分为:

['if', '(', 'method', '(', 'a', ',', 'b', ')', '.', 'equals', '(', '"C, C++, Java"', ')', ')'] 
基本上,我需要一个可以(取消)填充空格的令牌列表,而不改变代码的执行。如果我以前面的代码为例,我可以在标记周围添加和删除空格,形成如下形式:

if   (method    ( a,b)   . equals   ( "C, C++, Java")       )
我仍然会得到同样的结果


我猜这只能通过一些外部库实现,但我不知道有任何外部库。

像antlr或javacc这样的解析器生成器都有完整的java语法作为示例。您可以重用生成的标记器来实现您的目标


您还可以使用正则表达式实现某种标记化。但这并不是100%的java令牌。

问题是:最终,任何外部库都将使用标准java库。当然,您可以坐下来编写自己的Java解析器。从下到上

但真正的答案是:除非这是学校的项目,否则不要再发明轮子。当然,构建解析器和标记器对于程序员来说是非常有价值的一课,这也是一项相当艰巨的工作。而且,即使按照另一个答案中给出的方法(依赖现有技术的一部分),也可能会花费数天(可能数周)的时间


因此,当你问:如何有效地做到这一点,请注意现有的Java解析器;例如你看,在现实世界中,需求变化和发展很快。今天,我们要求您解决问题中概述的简单问题。但很可能,越来越多的关于该工具应该做什么的想法将不断发展。迟早,除了一个成熟的解析器,别无选择。那么,为什么不从这样一件事开始呢

一个邪恶的字符串拆分和正则表达式组合?@Artemis是的,但肯定有一些库可以将代码解析为单个元素?