我正在尝试编写一个非常基本的文本处理器。目标是通过char读取文件char并确定它是什么类型的令牌。基本上我所做的是将所有字符加载到一个队列中并使用peek()和read()检查顶部元素是否(对于此部分)是一个数字,如果它将它附加到一个字符串将用作不同符号的哈希映射中的键。
by issue是以下方法。当peek()看到一个数字时,char会与队列一起传递给此方法以进行进一步处理。我遇到的问题是,当我开始构建数字(作为一个字符串)时,我使用带有正则表达式的java matches()来匹配0-9中的数字,否则该方法应该停止构建字符串并返回lexeme对象。
但这就是我的问题所在。例如,在读取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) (SPACE ,, 26) (:= ,, 24) (SPACE ,, 26) (数字,42; EOF,29)
期望的输出: (关键字,标记,价值)
(identifier, ABC, 28)
(SPACE, , 26)
(:=, , 24)
(SPACE, , 26)
(number, 42, 29)
( ;, , 25)
(EOF, , 31)
答案 0 :(得分:0)
在你耗尽所有输入之前,我不认为你正在退出第一个循环。 c
永远不会更新(else if
中除外,它永远不会被调用)。在您的计划结束时,c
仍然等于'4'
。
作为解决方案的一般途径,您应该检查peek()
的值是否为可接受的值。这样,如果是,则拨打cl.read()
,如果不是,则表示您的号码已结束。