在Java中对源代码进行标记化处理

4
对于一门系统软件开发课程,我正在为一个由讲师发明的汇编语言编写完整的汇编器。目前我正在处理分词器。在进行一些搜索时,我遇到了Java的StringTokenizer类...但我发现它已经被基本废弃了。然而,与使用正则表达式的String.split方法相比,它似乎要容易得多。
是否有什么原因我应该避免使用它?或者,也许在典型的Java库中还有其他适合此任务的东西我不知道?
编辑:提供更多细节。
我考虑使用String.split复杂的原因是我对正则表达式的了解大概就是听说过。虽然作为软件开发人员,了解它们对我的一般知识可能会有所帮助,但我现在不确定是否想要投入时间,特别是如果存在更简单的替代方案。
关于我的分词器的使用:它将遍历包含汇编代码的文本文件,并将其拆分为标记,将文本和标记类型传递给解析器。定界符包括空格(空格、制表符、换行符)、注释开始字符“|”(可以出现在自己的一行上,也可以在其他文本后面),以及用于分隔指令中操作数的逗号。
我会更数学地写出来,但是我的形式语言知识有点生疏。
编辑2:更清晰地提问
我已经看过了StringTokenizer类的文档。它很适合我的目的,但其使用被不鼓励。除了String.split之外,是否有标准Java库中其他有用的东西?

你能解释一下你打算如何将输入字符串/源代码进行分词吗?很可能有比StringTokenizersplit(...)更好的方法来实现。 - Bart Kiers
5个回答

3

我相信java.util.Scanner类已经取代了StringTokenizer。Scanner可以让您逐个处理标记,而String.split()会将整个字符串分割(如果您正在解析源代码文件,则可能很大)。使用Scanner,您可以检查每个标记,决定采取什么操作,然后丢弃该标记。


通常情况下,你不应该一次解析整个源文件,而是逐行解析。这样更易于节省内存,并且可以更轻松地跟踪行号以便发出错误消息。 - David R Tribble

3
如果你正在构建一个汇编器,我会使用JavaCC来构建解析器/编译器。

这将是一个非常有用的工具,但我们明确被禁止使用这样的工具。不过还是谢谢你 - 这很酷! - rybosome

2

根据文档:

StringTokenizer是一个遗留类,由于兼容性原因而保留,但在编写新代码时不建议使用。建议任何需要此功能的人使用String的split方法或java.util.regex包。

以下示例说明了如何使用String.split方法将字符串拆分为其基本标记:

     String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);

打印以下输出:

     this
     is
     a
     test

没错,我也遇到过这个问题。如果我当时能更清楚地记录下来就好了,但是这就是我所说的“基本上已经被弃用”的意思。 - rybosome

1

我赞同这个观点。学习足够的正则表达式知识以有效地使用String.split或Scanner不会超过30分钟。对于程序员来说,学习编写基本的正则表达式很容易,而且需要很少的时间。成为一个专家将需要你职业生涯的余下时间。 - Mike Deck
1
尽管我仍然会对Jamie Zawinski的1997年引用感到好笑,他是Netscape和Mozilla.org的创始人之一:“有些人在面对问题时会想:‘我知道了,我会使用正则表达式。’现在他们有两个问题。” - crowne
那句话也是我最喜欢的。 - Greg Case

0

当有更好的替代方法或某些情况下这些方法是危险的时,某些东西就会被弃用。所以答案是-是的,你可以使用它,但有更好的方法来实现你需要的功能。

顺便问一句,split有什么复杂的?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接