我正在编写一个java程序,它将根据输入进行操作,这将是方案类型
语言。
像
这样的东西(+ (+ a b))
假设我现在想检查语法,如果有2个括号已打开,则必须有2个其他结束括号。我不知道如何使用正则表达式来实现这一点。你能帮帮我吗
答案 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");
}