首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

2.7  使用Scanner类分析复杂的语法

在上一节中,我们使用了Java 5中的Scanner类读取一个数据文件。该文件非常简单,因为每一行都采用相同的结构。如果希望读取一个每行的文本结构不相同的数据文件,那么该怎么呢?Matcher无法胜任此任务,因为它只能使用单个regex。而Scanner类则可以,因为它可以在输入文本上使用正则表达式来预测即将出现在文本中的模式。由于可以逐个地读取标记来读取输入,所以可以用它为任意类型的文本编写自定义分析器。下面以大楼安全事件日志虚构一个文件格式为例来说明。日志文件的每一行采用如下的结构:

eventType year month day time type-dependent-data

每行最后一部分的结构取决于事件类型。对于这样的结构,将需要根据事件类型按照逻辑来读取正确的标记。下面创建一个简单的文件,事件类型包括:大楼入口(entry)、大楼出口(exit)和警报(alarm)。下面是一个样本文件:

entry 2005 04 02 1043 meeting Smith, John

exit 2005 04 02 1204 Smith, John

entry 2005 04 02 1300 work Eubanks, Brian

exit 2005 04 02 2120 Eubanks, Brian

alarm 2005 06 02 2301 fire This was a drill

每种事件类型要求读取不同的结构。在此文件的第一行,John Smith在上午10:43进入大楼去参加一个会议。他于下午12:04离开大楼。此后Brian Eubanks在下午1:00进入大楼从事某项工作并于晚上9:20离开大楼。随后在晚上11:01出现了火警,并且带有注释来说明“这是一次演习”。我可以使用Scanner来读取此文件,如下面的代码所示:

Scanner scanner = new Scanner(new FileReader("logfile.txt"));

while (scanner.hasNext()) {

String type = scanner.next();

int year = scanner.nextInt();

int month = scanner.nextInt();

int day = scanner.nextInt();

int time = scanner.nextInt();

if (type.equals("entry")) {

String purpose = scanner.next(); // purpose of visit

// get the rest of the line and move to start of next line

String restOfLine = scanner.nextLine();

} else if (type.equals("exit")) {

String exitName = scanner.nextLine(); // rest of the line

} else if (type.equals("alarm")) {

String alarmType = scanner.next();

String comment = scanner.nextLine(); // rest of the line

}

}

scanner.close();

使用Scanner类时可采用的另一个技巧是使用findInLine方法。它可用来向前查找当前行中的模式。另一个可用的类似方法是findWithinHorizon,它可用来在当前行以外的数据流中查找模式。这种语法分析要求我们了解文件的文法或语法结构以便进行处理。在刚才编写的代码中,实际上隐含了有关内置于系统中的语法内容—— 即针对这种“日志”语言的分析器。 对于更复杂的语法,如处理脚本语言的语法,若从头编写自己的分析器很可能会引起逻辑错误。因此,对于较大和较复杂的语法,采用某种语法描述语言来说明语法本身要好得多,如JavaCC中提供的语言(参考第3章中题为“使用JavaCC创建分析器”一节)。词法分析的生成器使用语法元语言来产生能够处理语法的分析器类。

参考资料:

语法分析和编译器原理的详细内容不在本书的范围之内,要了解这些内容,请参考Addison-Wesley出版社1986年出版的由Alfred V. Aho, Ravi Sethi和Jeffrey D. Ullman编写的有关编译器的经典书籍Compilers: Principles, Techniques, and Tools。  

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论