Heim  >  Fragen und Antworten  >  Hauptteil

java - Wie teile ich eine Zeichenfolge der Form (Operator arg1 arg2 ... argn)?

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?

世界只因有你世界只因有你2674 Tage vor921

Antworte allen(2)Ich werde antworten

  • 仅有的幸福

    仅有的幸福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

    Antwort
    0
  • 阿神

    阿神2017-06-23 09:15:59

    正则:

    \(\s*\w+(\s+\d+)+\s*\)|\w+|\d+

    注意,此正则带有Global参数

    如果arg1, arg2, arg3, ... argn中嵌套(op arg ...)只有一层的话,可以用这个方法

    Antwort
    0
  • StornierenAntwort