0

我正在编写一个解析器,我目前正在匹配不同的标记,但我在匹配时遇到了一些麻烦。我有一个测试文件:

while a != b
  if a > b
    a := a - b
  if a <= b
    b := b - a
elihw

我的部分代码:

private static Scanner sc = new Scanner(System.in);
private static Pattern tokenPattern = Pattern.compile("[ ]+");
private static Pattern idPattern = Pattern.compile("[a-zA-Z]+");

....main(...) {
      sc.useDelimiter(tokenPattern);
      statement();
    }

public static void statement() {
    System.out.println("Statement");
    String token = null;
    while (sc.hasNext()) {
        if (sc.hasNext(idPattern)) {
            token = sc.next();
            System.out.print(" (" + token + ") ");
        }
        else {
            token = sc.next();
            System.out.print(token + ' ');
        }
    }
}

当我运行此方法时,它匹配运算符之前的字符串,但不匹配运算符之后的字符串。括号只是为了标记它匹配的那些。例如,线

a := a - b

将产生输出:

(a) := (a) - b

我无法弄清楚为什么 b 不匹配。

另外,如果有人可以帮助我使用匹配运算符的正则表达式,那就太好了。我已经尝试了很多这样的变化:

[\+\-\*\\]
[\\+\\-\\*\\\]
[+][-][*][/]

但似乎无法正确处理。

4

1 回答 1

0

扫描仪可能包含一个不可打印(换行)字符作为令牌的一部分。

尝试这个:

private static Pattern tokenPattern = Pattern.compile("[ \r\n\t]+");

对于运营商,试试这个:

[<>+-/*=:]+
于 2013-06-09T04:07:18.987 回答