解析一维语言


13

给定一个仅包含0的1、2和方括号的字符串,输出该字符串的语法树。

A 2需要2个参数-一个在左侧,另一个在右侧

A 1需要一个参数-向左或向右

A 0不需要任何参数,是基本情况

一对括号作为一个参数,并且括号的内容与字符串的其余部分分开计算。可以使用嵌套括号

输入字符串将始终是一棵完整的树,没有任何字符脱落。该字符串也只有一个正确的解决方案。请注意,这些函数是可交换的,并且参数的任何排列都是2可以接受的。您将不必处理不符合这些要求的输入。

输出语法格式将是function(arguments)递归形式

测试用例

0 --> 0
01 --> 1(0)
020 --> 2(0,0)
101 --> 1(1(0))
0120 --> 2(1(0),0)
0120210 --> 2(1(0),2(0,1(0)))
01210 --> 2(1(0),1(0))
(020)210 --> 2(2(0,0),1(0))
((020)20)1 --> 1(2(0,2(0,0)))

10201有效的输入?
尼尔

不,它可能是1(2(0,1(0)))或2(1(0),1(0))
蓝色

实际上我在想这是1(2(1(0),0));-)
Neil

1
我仍然看不到为什么0120210也不能解析为2[4](2[2](1[1](0[0]), 0[3]), 1[5](0[6]))括号中的数字指示字符串中的位置。
feersum

101也big昧。
feersum

Answers:


3

Python 3.6(预发行版),199

借助Morgan Thrapp,节省了6个字节

import re
def f(s):s=s.strip('()');i,j=[m.start()if m else-1for m in(re.search(c+'(?![^(]*\))',s)for c in'21')];return i>0and f'2({f(s[:i])},{f(s[i+1:])})'or j>=0and f'1({f(s[:j])or f(s[j+1:])})'or s

说明和非公开版本:

import re

def f(s):
    s=s.strip('()')
    # Search for '2' and '1' outside of brackets
    i, j = [m.start() if m else -1
            for m in (re.search(c + '(?![^(]*\))', s) for c in '21')]

    if i > 0:
        # Call `f(s[:i])` and `f(s[i+1:])`, concatenate the results
        return f'2({f(s[:i])},{f(s[i+1:])})'
    elif j>=0:
        # Call `f(s[:j])` and `f(s[j+1:])`, choose the non-empty result
        return f'1({f(s[:j]) or f(s[j+1:])})'
    else:
        return s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.