所以,我需要为作业编写一个编译器扫描程序,并认为使用正则表达式会很“优雅”。事实上,我以前很少使用它们,而且是很久以前的事了。所以我忘记了大部分关于他们的东西,需要四处看看。我成功地将它们用于标识符(或者至少我认为是这样,我仍然需要做一些进一步的测试,但现在它们看起来都不错),但是我在数字识别方面遇到了问题。
该函数nextCh()
读取输入中的下一个字符(前瞻字符)。我想在这里做的是检查这个 char 是否与 regex 匹配[0-9]*
。我将每个匹配的字符附加到str
当前令牌的字段中,然后读取该字段的 int 值。它可以识别单个数字输入,例如“123”,但我遇到的问题是,对于输入“123 456”,最终的 str 将是“123 456”,而我应该得到 2 个带有字段“123”和“ 456"。为什么“”被匹配?
private void readNumber(Token t) {
t.str = "" + ch; // force conversion char --> String
final Pattern pattern = Pattern.compile("[0-9]*");
nextCh(); // get next char and check if it is a digit
Matcher match = pattern.matcher("" + ch);
while (match.find() && ch != EOF) {
t.str += ch;
nextCh();
match = pattern.matcher("" + ch);
}
t.kind = Kind.number;
try {
int value = Integer.parseInt(t.str);
t.val = value;
} catch(NumberFormatException e) {
error(t, Message.BIG_NUM, t.str);
}
谢谢!
PS:我确实使用下面的代码解决了我的问题。不过,我想了解我的正则表达式中的缺陷在哪里。
t.str = "" + ch;
nextCh(); // get next char and check if it is a number
while (ch>='0' && ch<='9') {
t.str += ch;
nextCh();
}
t.kind = Kind.number;
try {
int value = Integer.parseInt(t.str);
t.val = value;
} catch(NumberFormatException e) {
error(t, Message.BIG_NUM, t.str);
}
编辑:原来我的正则表达式也不适用于标识符识别(同样,包括空白),所以我不得不切换到类似于我的“解决方案”的系统(虽然有很多条件)。猜猜我需要再次研究正则表达式:O