将Java代码拆分为Tokens

时间:2017-06-05 17:35:58

标签: java parsing split

我需要能够将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")       )

我仍会得到相同的结果。

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

2 个答案:

答案 0 :(得分:2)

事情是:最后,任何外部库都将使用标准Java库。所以当然:你可以坐下来编写自己的Java解析器。从下到上。

但真正的答案是:除非这是一个学校项目,否则不要重新发明轮子。当然,构建解析器和标记器对程序员来说是一个非常宝贵的教训,它也是一些工作。即使遵循另一个答案中给出的方法(依赖于现有技术的一部分),它可能会花费你几天(可能是几周)。

因此,当您询问:如何有效地执行此操作时,请注意现有的Java解析器;例如JavaParser。您可以看到,在现实世界中,需求会发生变化并迅速发展。今天你被要求解决问题中概述的简单问题。但是,工具应该做的越来越多的想法可能会发生变化。迟早,除了一个完整的解析器之外别无他法。那么为什么不首先从这样的事情开始呢?

答案 1 :(得分:0)

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

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