一个函数形如
(operator arg1 arg2 ... argn)
即操作符号,参数1参数2一直到参数n。其中参数本身也可以是一个这样格式的函数。
比如这样一串字符串
String="(add (add 1 2) (mul 2 1) 2 )"
要把它的操作数和参数分割出来,即分割成
["add","(add 1 2)","(mul 2 1)","2"]
这样的字符数组,应该如何分割?
目前我的做法是每次先把最外边的括号去掉,然后想用空格分割字符串,可是这样中间的空格也会成为要分割的地方。如果用正则表达式,因为每一个参数内部还是可能嵌套括号,这种情况应该如何匹配呢?
前缀表示法
,S-表达式
,Lisp表达式
lisp的
S-表达式
是多层嵌套的树形结构,比较接近抽象语法树(AST)
。正则如果没有递归语法的话,很难解析
S-表达式
。下面是个python的简单例子,我做了注释,应该很容易理解。
S-expression
正则:
注意,此正则带有Global参数
如果
arg1, arg2, arg3, ... argn
中嵌套(op arg ...)
只有一层的话,可以用这个方法