0

我想知道如何在 C++ 和 Java 中做到这一点(编辑:我不是同时的意思。我问了两个类似的问题,“我如何在 C++ 中做到这一点?”和“我该如何做到这一点在 Java 中?”)。

我想解析来自文件的输入并将 '(' 和 ')' 视为除空格之外的分隔符。但我也希望每次遇到 '(' 或 ')' 都被识别为一个单独的标记。所以例如在解析时

这 contians (嵌套(括号))

我想连续调用 next() (或 >>)给(每行一个)

This
contains
(
nested
(
parentheses
)
)
<end of input>

是否有内置此功能的解析器/扫描器?我知道 Java 的 Scanner 很强大,但据我所知,没有办法确定每次遇到下一个标记时匹配哪个分隔符。

4

2 回答 2

1

抛开编译器-编译器讨论不谈,这种解析器可以使用两个索引天真地实现,如下所示:

for(int i = 0; i < str.size(); ) {
  int j = i;
  for(; j < str.size(); ++j) {
    // check for spaces
    if(str[j] == ' ') {
      // capture substring index i to j-1 as a token
      i = j+1;
      break;
    }

    // check for brackets
    if(str[j] == '(' || str[j] == ')') {
      // str[j] is a token
      i = j+1;
      break;
    }

  }

  // no more characters to check
  if(j >= str.size()) break;
}

基本上 i 是指示标记开始的标记,而 j 用于搜索标记结束的位置。

免责声明:上面的代码未经测试,可能包含语法错误和错误,尤其是空输入、空白等,并且可能在大数据上表现不佳。请在重新发明轮子之前考虑使用 3rd 方库。

或者对于代码量最少的解决方案,您可以将每次出现的“(”替换为“(”(同样使用“)”)并进行空格标记化:

str.replaceAll("(", " ( ").split("\s+");
于 2013-08-13T07:35:27.437 回答
0

这应该可以通过正则表达式轻松处理。类似于 `"\\s*(?:(\\w+)|([()]))" 的东西应该在 C++11 中发挥作用(对于早期版本的 C++,你需要 Boost 常规表达式)。Java 也有正则表达式支持,所以你应该可以在那里做同样的事情。

在这两种情况下,上述表达式都会跳过空白,然后“捕获”第 1 组中的符号或第 2 组中的括号。

于 2013-08-13T09:20:46.633 回答