我有一个字符串,如“A和B或不是C和D”。原子都是简单的大写字母A,B,C ......而运算符只是{和,或者不是}。我想设计一种算法,可以添加通常的优先规则所隐含的括号。
有人能想到一个非常简单的方法吗?也许使用正则表达式?
所需的输出是“(A和B)或((不是C)和D)”。
答案 0 :(得分:3)
它可以像这样简单(前面的Python代码):
.ui-layout-pane-east {
padding: 0 !important;
}
结果:
def popnext(stream, token):
if stream[0:len(token)] == list(token):
del stream[0:len(token)]
return True
return False
def parse_binary(stream, operator, nextfn):
es = [nextfn(stream)]
while popnext(stream, operator):
es.append(nextfn(stream))
return '(' + ' {} '.format(operator).join(es) + ')' if len(es) > 1 else es[0]
def parse_ors(stream):
return parse_binary(stream, 'or', parse_ands)
def parse_ands(stream):
return parse_binary(stream, 'and', parse_unary)
def parse_unary(stream):
if popnext(stream, 'not'):
return '(not {})'.format(parse_unary(stream))
return parse_primary(stream)
def parse_primary(stream):
if popnext(stream, '('):
e = parse_ors(stream)
popnext(stream, ')')
return e
return stream.pop(0)
def evaluate(expression):
return parse_ors(list(expression.replace(' ', '')))[1:-1]
print evaluate('A and B or not C and D')
print evaluate('A and (B or not C) and D')
答案 1 :(得分:0)
这些字符串的语法可能由以下production rules定义:
or
E and
F not
T A
B
C
D
(制定规则6" T →不是T"),如果也允许使用"not not D and not not not B"
这样的字符串。)
虽然这个语法没有上下文,但它不是regular。我不认为你的字符串的常规语法存在,所以正则表达式不足以完全匹配这些字符串,并且通过扩展也不能正确地解析和转换(重写)它们。