【发布时间】:2015-03-15 05:24:48
【问题描述】:
我正在尝试编写一个非常基本的文本处理器。目标是逐字符读取文件并确定它是什么类型的令牌。基本上我所做的是将所有字符加载到队列中,并使用 peek() 和 read() 检查顶部元素是否(对于这部分)是一个数字,如果它将它附加到一个字符串用作不同符号的哈希映射中的键。
按问题在以下方法中。当 peek() 看到一个数字时 char 与队列一起传递给此方法以进行进一步处理。我遇到的问题是,当我开始构建数字(作为字符串)时,我使用带有正则表达式的 java match() 仅匹配 0-9 的数字,否则该方法应该停止构建字符串并返回词位对象。
但这就是我的问题所在。例如,在它读取 4 和 2 之后,它会不断添加队列中的所有字符,直到它为空 - 并将其全部集中在数字下而不是创建新令牌。
任何指导将不胜感激。我有点卡在这里。
我的意见: ABC := 42 ; EOF
代码:
/**
*
* @param - cl ADT containing each character as read from a file
* @param - c current head of the ADT
* @return - lexeme 3 tuple that holds the keyword "number", the token read in, and the value 19
*/
public static Lexeme isNumber(CharQue<Character> cl, char c){
Lexeme lexeme = new Lexeme();
while (String.valueOf(c).matches("[0-9]") && (cl.hasNext())) {
if (String.valueOf(c).matches("[0-9]")) {
lexeme.buildKey(cl.read());
} else if(c =='.'){
lexeme.buildKey(c);
c = cl.peek();
break;
}
}
while(String.valueOf(c).matches("[0-9]") && (cl.hasNext())){
c = cl.read();
if (String.valueOf(c).matches("[0-9]")) {
lexeme.buildKey(c);
}
}
lexeme.setTokken(lexeme.getKey());
lexeme.setKey(NUMBER);
return lexeme;
}
结果:在(关键字,它读入的内容,分配给该关键字的值)的 3 元组中。 (关键字、令牌读取、值) ---------------------- (标识符,ABC,28) (空间, , 26) (:=, , 24) (空间, , 26) (数字,42;EOF,29)
期望的输出: (关键字、令牌、值)
(identifier, ABC, 28)
(SPACE, , 26)
(:=, , 24)
(SPACE, , 26)
(number, 42, 29)
( ;, , 25)
(EOF, , 31)
【问题讨论】:
-
你能添加你期望的输出吗?
-
另外,关于
cl中的内容的更多信息会很好。整行应该在其中还是我们应该只分析一个标记? -
你不需要队列就可以看到下一个字符:这太过分了,而且它掩盖了你需要做的事情,这很简单:如果下一个字符是数字,则累积它,以及以下所有也是数字的字符。如果你停在一个点上,也要累积它,以及后面的所有数字。大约有六行代码。
-
这就是整个混乱的开始。我正在使用 FileReader 对象一次读取一个字符,但我总是向多个读取一个字符。我想要一种方法来偷看()。
标签: java regex text-parsing lexical-analysis