将分隔符视为输入标记

时间:2013-08-13 07:04:48

标签: java c++ parsing delimiter parentheses

我想知道如何在C ++和Java中执行此操作(编辑:我不是同时意思。我问两个类似的问题,“我如何在C ++中执行此操作?”和“如何做我是用Java做的吗?“)。

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

  

这个contians(嵌套(括号))

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

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

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

2 个答案:

答案 0 :(得分:1)

除了Compiler-compiler讨论之外,这种解析器可以使用两个索引天真地实现,如下所示:

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;
}

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

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

或者对于代码量最少的解决方案,您只需将每次出现的“(”替换为“(”(同样带有“)”)并执行空格标记化:

str.replaceAll("(", " ( ").split("\s+");

答案 1 :(得分:0)

这应该通过正则表达式轻松处理。 “\\ s *(?:( \\ w +)|([()]))”的行应该做什么 C ++ 11中的技巧(对于早期版本的C ++,你需要它 提升正则表达式)。 Java也有正则表达式 支持,所以你应该能够在那里做同样的事情。

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

相关问题