我正在编写一个java程序,该程序将根据方案类型中的输入进行操作
的语言。
之类的(+ (+ a b))
假设我现在想检查语法,如果有两个括号已经打开,那么必须有另外两个结束括号。我不确定如何用正则表达式实现这一点。你能帮我一下吗
正则表达式不能将括号配对到任意深度。
http://en.wikipedia.org/wiki/Regular_language The_number_of_words_in_a_regular_language
因此,某些语言L'的非正则性可以通过计数L'中的单词来证明。例如,考虑平衡括号字符串的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");
}