Heim > Fragen und Antworten > Hauptteil
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?
仅有的幸福2017-06-23 09:15:59
前缀表示法
, S-表达式
,Lisp表达式
lisp的S-表达式
是多层嵌套的树形结构,比较接近抽象语法树(AST)
。
正则如果没有递归语法的话,很难解析S-表达式
。
下面是个python的简单例子,我做了注释,应该很容易理解。
def parse_sexp(string):
sexp = [[]]
word = ''
in_str = False #是否在读取字符串
for char in string: # 遍历每个字符
if char == '(' and not in_str: # 左括号
sexp.append([])
elif char == ')' and not in_str: # 右括号
if word:
sexp[-1].append(word)
word = ''
temp = sexp.pop()
sexp[-1].append(tuple(temp)) # 形成嵌套
elif char in ' \n\t' and not in_str: # 空白符
if word:
sexp[-1].append(word)
word = ''
elif char == '"': # 双引号,字符串起止的标记
in_str = not in_str
else:
word += char # 不是以上的分隔符,就是个合法的标记
return sexp[0]
>>> parse_sexp("(+ 5 (+ 3 5))")
[('+', '5', ('+', '3', '5'))]
>>> parse_sexp("(add (add 1 2) (mul 2 1) 2 )")
[('add', ('add', '1', '2'), ('mul', '2', '1'), '2')]
S-expression
阿神2017-06-23 09:15:59
正则:
\(\s*\w+(\s+\d+)+\s*\)|\w+|\d+
注意,此正则带有Global参数
如果arg1, arg2, arg3, ... argn
中嵌套(op arg ...)
只有一层的话,可以用这个方法