Eine Funktion hat die Form
(Operator arg1 arg2 ... argn)
das heißt, das Operationssymbol, Parameter 1, Parameter 2, bis Parameter n. Der Parameter selbst kann in diesem Format auch eine Funktion sein.
Zum Beispiel muss eine Zeichenfolge wie diese
String="(add (add 1 2) (mul 2 1) 2 )"
in ihre Operanden und Parameter unterteilt werden, also in
["add","(add 1 2)","(mul 2 1)","2"]
Wie sollte ein solches Zeichenarray aufgeteilt werden?
Mein aktueller Ansatz besteht darin, jedes Mal die äußersten Klammern zu entfernen und dann Leerzeichen zum Teilen der Zeichenfolge zu verwenden, aber die Leerzeichen in der Mitte werden auch zu den Stellen, an denen geteilt werden soll. Wenn Sie reguläre Ausdrücke verwenden, wie sollte diese Situation angepasst werden, da jeder Parameter möglicherweise noch verschachtelte Klammern enthält?
前缀表示法
,S-表达式
,Lisp表达式
lisp的
S-表达式
是多层嵌套的树形结构,比较接近抽象语法树(AST)
。正则如果没有递归语法的话,很难解析
S-表达式
。下面是个python的简单例子,我做了注释,应该很容易理解。
S-expression
正则:
注意,此正则带有Global参数
如果
arg1, arg2, arg3, ... argn
中嵌套(op arg ...)
只有一层的话,可以用这个方法