正则表达式为计划类型的输入

时间:2011-09-22 22:17:23

标签: java regex scheme

我正在编写一个java程序,它将根据输入进行操作,这将是方案类型

语言。

这样的东西
(+ (+ a b))

假设我现在想检查语法,如果有2个括号已打开,则必须有2个其他结束括号。我不知道如何使用正则表达式来实现这一点。你能帮帮我吗

1 个答案:

答案 0 :(得分:6)

正则表达式不能将括号与任意深度配对。 Scheme语法不规则。

http://en.wikipedia.org/wiki/Regular_language#The_number_of_words_in_a_regular_language

  因此,可以通过计算L'中的单词来证明某种语言L'的非规则性。例如,考虑平衡括号字符串的Dyck语言。 Dyck语言中长度为2n的单词数等于加泰罗尼亚语数...,其形式不是p(n)λn,见证了Dyck语言的非规律性。

你将不得不对其进行标记,然后遍历计算深度的标记,并确保最后的深度为零并且永远不会消极。

对于一个简单的语言,其括号空格和标识符由重复的字母'a'组成,你可能会这样做

Patter token = Pattern.compile("[() ]|a+|.", Pattern.DOT_ALL);
Matcher m = token.matcher(sourceCode);
int parenDepth = 0;
while (m.find()) {
  char ch = m.group().charAt(0);
  switch (ch) {
    case '(':
      ++parenDepth;
      break;
    case ')':
      if (parenDepth == 0) {
        fail("Too many close parens");
      }
      --parenDepth;
      break;
  }
}
if (parenDepth != 0) {
  fail(parenDepth + " unclosed lists");
}