标记化Java中的标记化源代码
对于系统软件开发课程,我正在为讲师发明的汇编语言编写一个完整的汇编程序。目前我正在开发标记器。在进行一些搜索时,我遇到了Java StringTokenizer
类。。。但我看到它基本上已经被弃用了。然而,它似乎比带有正则表达式的String.split
方法更容易使用
有什么理由我应该避免使用它吗?在典型的Java库中,是否还有其他适合这项任务的东西我不知道
编辑:提供更多细节
我之所以认为String.split
很复杂,是因为我对正则表达式的了解大致相当于我对它们的了解。虽然了解他们对我作为软件开发人员的一般知识很有帮助,但我不确定我现在是否想投入时间,特别是如果有更简单的替代方案的话
就我对标记器的使用而言:它将遍历一个包含汇编代码的文本文件,并将其分解为标记,将文本和标记类型传递给解析器。分隔符包括空格(空格、制表符、换行符)、注释开始字符“|”(可以出现在自己的行上,也可以出现在其他文本之后),以及用于分隔指令中操作数的逗号
我会用更数学的方法来写,但我对形式语言的知识有点生疏
编辑2:更清晰地提问
我看过StringTokenizer类的文档。它本来很适合我的目的,但不鼓励使用它。除了String.split
之外,标准java库中还有什么有用的东西吗
# 1 楼答案
不要害怕正则表达式,给自己找一个正则表达式编辑器,比如下面的eclipse插件,
http://brosinski.com/regex/update您将能够在不编译甚至在编写程序之前测试表达式
如果您需要更多参考资料,以下是一些非常有用的网站:
尽管我认为上面使用JavaCC的建议听起来是正确的方法
另一个选择是ANTLR
下面是一篇比较ANTLR vs JavaCC经历的帖子
# 2 楼答案
我相信爪哇。util。Scanner类已取代StringTokenizer。Scanner允许您一次处理一个令牌,而不是字符串。split()将拆分整个字符串(如果您正在分析源代码文件,那么这个字符串可能会很大)。使用Scanner,您可以检查每个令牌,决定要采取的操作,然后丢弃该令牌
# 3 楼答案
如果有更好的选择,或者这些方法在某些情况下是危险的,那么就不推荐使用某些方法。所以答案是——是的,你可以使用它,但有更好的方法来实现你的需求
顺便说一句,分裂有什么复杂之处
# 4 楼答案
如果你正在构建一个汇编程序,我会使用JavaCC来构建解析器/编译器
# 5 楼答案
从文件中:
StringTokenizer是一个遗留类,出于兼容性原因保留了它,尽管新代码中不鼓励使用它。建议任何寻求此功能的人使用String或java的split方法。util。改为正则表达式包
下面的示例说明了字符串是如何生成的。split方法可用于将字符串拆分为基本标记:
打印以下输出: