带有空分隔符的Java扫描程序

时间:2009-12-25 23:12:08

标签: java parsing lexical-analysis

我想使用手写的降序解析器解析一些文本。我将Scanner与以下分隔符"\\s*"一起使用。不幸的是,这个模式匹配一​​个空字符串的事实似乎使每个hasNextFoonextFoo不再匹配。

该文件没有说明可能是空的分隔符。

4 个答案:

答案 0 :(得分:1)

您对“+”字符有异议吗?

您确定要使用正则表达式,而不只是对空格字符进行if语句测试吗?你说'运行时'。您的数据是在字符串中,还是在流中,或者是什么?

答案 1 :(得分:1)

您可能还会考虑StreamTokenizer。以下是在recursive-descent parser中将其用于单符号预测的示例。

答案 2 :(得分:1)

  

是的,因为我想将扫描仪用作运行时词法分析器。简而言之,我希望能够询问scanner.next(pattern),它将返回匹配的字符串,或者在不消耗流的情况下返回异常。空间应该被忽略。如果有一个比扫描仪更好的课程,我很乐意使用它。

我想不出任何现成的库类会为你做这件事。扫描仪/词法分析器的正常模型是将消耗任何无效字符序列(即导致异常的字符序列)。因此,我认为您将不得不手动实现自己的扫描仪,注意将预读字符视为未消耗的。您可以使用“推回”阅读器或(如果该模型不方便)通过使用某种标记/重置模型自己显式缓冲字符来执行此操作。如果你所做的只是分成由一个或多个空格分隔的标记,那么推回阅读器的方法应该没问题。

答案 3 :(得分:0)

可以使用lookbehinds / lookaheads来明确定义哪些分隔符可以省略。

例如,此扫描程序使用空格作为分隔符,但在数字和单词之间不需要它们:

new Scanner("1A.23 4 BC-5")
.useDelimiter("\\s+|(?<=\\d)(?=[A-Z])|(?<=[A-Z])(?=[-+.\\d])");

它产生:

1
A
.23
4
BC
-5

正则表达式由三个替代组成:

  • \s+个连续的空格是分隔符。
  • (?<=\d)(?=[A-Z])数字和字母之间的空字符串是分隔符。
  • (?<=[A-Z])(?=[-+.\d])字母和' - ','+',''之间的空字符串。要么 数字是分隔符。

(注意:\w不能在这里使用,因为它匹配数字。)