人物向前看

时间:2011-11-01 19:13:35

标签: java lookahead

我如何在Java中制作角色预见方法?我有一个文本文件(比方说TextFile.txt)我需要它首先读入单个字符,识别它,如果它是一个特殊字符(如{= +;​​等),则将其作为Y类型的标记返回。如果角色不是特殊的(如数字或字母),那么它应该向前看,看看是否有特殊字符或空格,当一个字符出现时,程序应该返回该字符集作为类型X的标记。如果程序读取一个数字,后跟另一个数字,然后是一个字母,它应该只返回Z类型的两个数字。

例如,在TextFile.txt中有以下文本:

{ test; 123test test5
test/-=test}

程序将读取文件,看到'{',将该标记返回为Y,看到空格,忽略它,看到't',因为那不是特殊字符,向前看并看到另一个字母,直到它达到';',并返回'test'作为X类型的标记。程序应该读为'123',返回为Z,然后读'test'并返回X.

我理解程序应该如何工作,但我不知道如何使用前瞻性字符阅读器。我查看了Scanner类,但是没有nextChar()方法(这本来很有用)。

7 个答案:

答案 0 :(得分:1)

我认为你真的不需要任何预测字符,只能将整个文本读入字符串并迭代其char数组。检查每个char是否为isDigit或isLetter - 如果它是添加到字符串缓冲区,否则将缓冲区的内容刷新到包含所有标记的列表中。如果缓冲区为空且字符是数字,请设置一个标志,并在遇到除数字之外的任何内容时立即刷新。这应该是我猜的。

答案 1 :(得分:1)

由于您只需要一个前瞻字符,我建议您使用PushbackReader。您也可以使用supports marking,的阅读器,但在此应用程序中,我认为推回更容易理解。这两个选项在前瞻修复时都有效(在这种情况下是一个字符)。

简单地说,你从流中读取一个字符并决定它是哪种标记类型(如果它是空格,扔掉它再试一次)。以StringBuilder之类的方式累积令牌的此字符和后续字符。继续阅读,直到您阅读不属于该类型的字符。 Push the bad character back to the stream,并返回令牌。下次请求令牌时,推回的字符将位于流的开头。

以这种方式处理流是节省内存的,因为前瞻是固定的。所需的空间不依赖于流的长度(事实上,它将与无限长的流一起工作)。

答案 2 :(得分:0)

您希望使用InputStream类型(在您的情况下可能为FileInputStream),并使用read()方法逐个删除一个字符。如果这些字符不是特殊字符/空格,请将它们保存在缓冲区中,直到找到特殊字符/空格,然后将缓冲区的内容作为X类型的标记返回。

答案 3 :(得分:0)

扫描仪没有nextChar(),但您可以使用Scanner.hasNext(String)。 E.g。

scanner.hasNext("x")

将测试是否跟随字母x。对于更复杂的预测,您可以使用Scanner.hasNext(Pattern)

答案 4 :(得分:0)

您不需要任何特殊的超前功能。您只需要将文件作为FileReader打开。然后,在处理每个字符时,如果它不是特殊字符,则需要在单独的StringBuilder中累积这些字符,直到找到特殊字符并确定当前标记的类型。

答案 5 :(得分:0)

你的问题不是很具描述性......但我认为这可能会给你一个起点。将文本文件的内容拆分为一个字符数组。然后分别查看每个角色并执行测试/比较

char[] cArray = textToRead.toCharArray();

for(int i = 0; i < cArray.length; i++){
    //perform your logic here
}

遍历每个字符并跟踪字符串或字符变量中的所需内容。

答案 6 :(得分:0)

听起来像语言解析。我建议使用ANTLR。请查看http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3