1

그래서이 문제로 고투 2 일 후 나는 포기했다. 당신은 두 개의 입력을받습니다. 첫 번째는 명제가 포함 된 목록이고 두 번째는 사전입니다.주어진 사전 키를 기반으로 해답을 취하고 답을 반환하는 파이썬에서 문자열 해석기를 만드는 방법은 무엇입니까?

예 :

arg= [<prop1>, "OPERATOR (AND OR)", 
[ "NOT" ,["NOT",<prop2>,"OPERATOR"[<prop2>, "OPERATOR", <prop3>]]] 

I 문제 못해 이중 재귀를 사용하지 않고 해결 될 수 있음을 베팅하고 :

arg= [<prop1>, "OPERATOR", <prop2>] 

dicti= {<prop1>: key1, <prop2394>: key2394,<prop2>:key2} 

다음 가능한 입력된다. 이 문제를 해결하기위한 시도입니다. 입력 내용이 "flat"목록 인 목록의 요소로 목록이없는 1D 목록을 의미하는 기본 사례부터 시작했습니다. 프로그램은 부울 값을 반환하지 말고 사전에 주어진 true 또는 false을 반환해야합니다.

def interpret(arg, keys): 
    if not arg : 
     return "false" 
    elif not arg and not keys: 
     return "false" 
    elif not keys and isinstance(arg,list): 
     return "true" 
    elif isinstance(arg[0],list): 
     return interperter(arg[0:],keys) 
    else: 
     trueCnr=0 
     for i in range(len(arg)): 
      if arg[i] in keys and keys[arg[i]]=="true": 
       if isinstance (arg[i], list): 
        if("NOT" in arg): 
         indx= arg.index("NOT") 
         keys[arg[indx+1]]= "true" if keys[arg[indx+1]]=="true" else "false" 
        trueCnr+=1 
     print(trueCnr) 
     if trueCnr==len(arg)-1 and "AND" in arg: return "true" 
     elif trueCnr!= 0 and "OR" in arg: return "true" 
     else: return "false" 

print (interpret(["door_open", "AND", ["NOT","cat_gone"]], {"door_open" : "false", "cat_gone" : "true", "cat_asleep" : "true"})) 

내 질문은 여기서부터 어떻게 진행합니까?

+0

명제는 무엇입니까 예고? –

+0

출력을 어떻게 표시 하시겠습니까? 입력을 출력으로 변환하는 규칙은 무엇입니까? –

+0

@HaiVu는 "참"또는 "거짓"으로 부울 True 또는 False가 아닙니다. –

답변

0

재귀를 사용해야합니다. 명제를 평가하려면 함수 eval(prop, keys)을 정의하십시오. 그런 다음 명제를 사례와 일치시킵니다. 위가 표시되면 예를 들어,

['prop1', 'AND', 'prop2'] 

, 당신은

return eval(prop[:1], keys) and eval(prop[1:], keys) 

A와 더 복잡한 예를 평가하는 것입니다 :

[ "NOT" ,["NOT",'prop2',"OPERATOR"['prop2', "OPERATOR", 'prop3']]] 

의 모습

return not eval(prop[1], keys) 

실현해야 할 것은 각각 eval으로 전화하면 정확히 한 명의 연산자가 우선합니다. 당신의 임무는 어떤 사업자인지를 인식 한 다음 나머지 목록을 다른 eval 통화로 전달하여 처리하도록하는 것입니다. 의사에서

:

또한
def eval(prop, keys): 
    if not prop: 
    return False 
    if prop is a key: 
    return keys[prop] 
    if prop has a binary operator: 
    return eval(stuff before operator) operator eval(stuff after operator) 
    if prop has unary operator: 
    return operator eval(stuff after operator) 

, 당신은 논리 값 TrueFalse하지 문자열을 반환해야 'True'와 'False'

+0

요점은 불리언 값이 아닌''true ''와''false "'를 반환하는 것이고, 당신의 의사 코드는 그것을 해결하지 못했습니다 –