Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的标记化源代码_Java_Tokenize - Fatal编程技术网

Java中的标记化源代码

Java中的标记化源代码,java,tokenize,Java,Tokenize,对于系统软件开发课程,我正在为讲师发明的汇编语言编写一个完整的汇编程序。目前我正在开发标记器。在进行一些搜索时,我遇到了JavaStringTokenizer类……但我发现它基本上已经被弃用了。但是,它似乎比使用正则表达式的String.split方法要容易得多 有什么理由我应该避免使用它吗?在典型的Java库中,是否还有其他适合此任务的东西我不知道 编辑:提供更多细节 我之所以考虑将String.split复杂化,是因为我对正则表达式的了解与我对它们的了解大致相同。虽然了解他们对我作为软件开发

对于系统软件开发课程,我正在为讲师发明的汇编语言编写一个完整的汇编程序。目前我正在开发标记器。在进行一些搜索时,我遇到了Java
StringTokenizer
类……但我发现它基本上已经被弃用了。但是,它似乎比使用正则表达式的
String.split
方法要容易得多

有什么理由我应该避免使用它吗?在典型的Java库中,是否还有其他适合此任务的东西我不知道

编辑:提供更多细节

我之所以考虑将
String.split
复杂化,是因为我对正则表达式的了解与我对它们的了解大致相同。虽然了解他们对我作为软件开发人员的一般知识很有帮助,但我不确定我现在是否想投入时间,特别是如果有更简单的替代方案的话

就我对标记器的使用而言:它将遍历一个包含汇编代码的文本文件,并将其分解为标记,将文本和标记类型传递给解析器。分隔符包括空格(空格、制表符、换行符)、注释开始字符“|”(可以出现在它自己的行上,也可以出现在其他文本之后)以及用于分隔指令中操作数的逗号

我会用数学的方法来写,但我对形式语言的知识有点生疏了

编辑2:更清楚地提问


我已经看过关于StringTokenizer类的文档。它本来很适合我的目的,但它的使用是不被鼓励的。除了
String.split
,标准java库中还有什么有用的东西吗?

来自文档:

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]);

我相信java.util.Scanner类已经取代了StringTokenizer。Scanner允许您一次处理一个令牌,而String.split()将拆分整个字符串(如果您正在解析源代码文件,那么这个字符串可能会很大)。使用Scanner,您可以检查每个令牌,决定要采取的操作,然后丢弃该令牌。

如果有更好的替代方法,或者这些方法在某些情况下是危险的,则不推荐使用这些方法。所以答案是-是的,你可以使用它,但是有一个更好的方法来实现你所需要的


顺便说一句,分裂有什么复杂之处

如果您正在构建的是汇编程序,我将使用它来构建解析器/编译器。

不要害怕正则表达式,为自己准备一个正则表达式编辑器,比如下面的eclipse插件,
您可以在不编译甚至编写程序之前测试表达式

如果您需要更多参考资料,以下是一些非常有用的网站:

尽管我认为上述使用JavaCC的建议听起来是正确的方法。
另一个选择是


这里有一篇文章比较了的经验。

您能解释一下如何标记您的输入字符串/源吗?变化在于,有更好的方法可以做到这一点,而不是
StringTokenizer
split(…)
都可以做到。通常,您不应该一次解析整个源文件,而是一次解析一行源代码。这在内存上更容易,并且更容易跟踪发出错误消息的行号。对,我也遇到了这个问题。如果我能更清楚地指出这一点,那就好了,但这正是我在说“基本上不赞成”时所指的。这是一个非常有用的工具,但我们被明确禁止使用这样的工具。不过,谢谢你——这太酷了!我支持这个。您不需要超过30分钟就可以充分了解regex,从而有效地使用String.split或Scanner。对于程序员来说,学习编写基本正则表达式很容易,而且花费的时间很少。成为一名大师将带你度过余生。尽管我仍然对网景和Mozilla.org创始人之一Jamie Zawinski 1997年的一句话嗤之以鼻:“有些人在遇到问题时,会认为‘我知道,我会使用正则表达式。现在他们有两个问题。’这句话也是我最喜欢的。
     this
     is
     a
     test