java - Bagaimana untuk memisahkan rentetan borang (pengendali arg1 arg2 ... argn)?
世界只因有你
世界只因有你 2017-06-23 09:13:59
0
2
965

Sesuatu fungsi adalah dalam bentuk
(operator arg1 arg2 ... argn)
iaitu, simbol operasi, parameter 1, parameter 2, sehingga parameter n. Parameter itu sendiri juga boleh menjadi fungsi dalam format ini.
Sebagai contoh, rentetan seperti ini
String="(tambah (tambah 1 2) (mul 2 1) 2 )"
perlu dibahagikan kepada operan dan parameternya, iaitu dibahagikan kepada

["tambah","(tambah 1 2)","(mul 2 1)","2"]

Bagaimanakah susunan aksara sedemikian harus dibahagikan?

Pendekatan semasa saya adalah untuk mengeluarkan kurungan paling luar setiap kali, dan kemudian ingin menggunakan ruang untuk membelah rentetan, tetapi ruang di tengah juga akan menjadi tempat untuk dibelah. Jika anda menggunakan ungkapan biasa, memandangkan setiap parameter mungkin masih mempunyai kurungan bersarang di dalamnya, bagaimanakah keadaan ini harus dipadankan?

世界只因有你
世界只因有你

membalas semua(2)
仅有的幸福

前缀表示法S-表达式Lisp表达式

bisuS-表达式是多层嵌套的树形结构,比较接近抽象语法树(AST).

Lazim sukar dihuraikan tanpa tatabahasa rekursifS-表达式.

Berikut adalah contoh mudah dalam python saya telah mengulasnya dan ia sepatutnya mudah difahami.

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-ungkapan

阿神

Biasa:

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

Perhatikan bahawa regex ini mempunyai parameter Global

Jikaarg1, arg2, arg3, ... argn中嵌套(op arg ...)hanya ada satu lapisan sahaja boleh guna cara ni

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan