저는 인터프리터 작성에 대해 배우기 위해 장난감 언어에 대한 인터프리터로 작업하고 있습니다. 나는 이미 구문 분석 트리를 생성하는 문법에 대한 간단한 파서를 구현했다.표현식 코딩에서 다형성 사용에 대한 의심 구문 트리/평가자
class Node:
def __init__(self,left,right):
self.left=left
self.right=right
def evaluate(self):
print "throw an exception"
class AddNode(Node):
def evaluate(self):
return evaluate(self.left)+evaluate(self.right)
class SubNode(Node):
def evaluate(self):
return evaluate(self.left)-evaluate(self.right)
방법은 모든 자손에서 재정의되는 평가 : 자, 파스 트리를 평가하는 일반적인 방법은 (파이썬) 아래에 뭔가를 보이는 코드, 파스 트리의 노드에서 다형성을 사용하는 것입니다 필요에 따라 행동하도록 방어하십시오. 표현식의 값은 루트에서 단순히 evaluate()을 호출하여 찾을 수 있습니다.
또 다른 방법은 노드에서 평가 기능을 사용하지 않고 단순히 유형을 노드에 할당하는 구문 분석 트리를 생성하는 것입니다. 평가 코드는 각 노드를 재귀 적으로 검사하고 평가하는 방법을 결정하는 별도의 기능으로 수행됩니다. 이렇게하면 "if else"구조, 스위치 또는 점프 테이블이 큰 함수가됩니다.
내가 볼 때 거의 모든 곳에서, 내가 대학에서 가르친 것은 첫 번째 방법이 항상 더 나은 것으로 나타납니다. 내가 완전히 이해하지 못하는 이유는 첫 번째 방법이 두 번째 방법보다 우월해야하는 이유입니다. 이 경우 다형성이 반드시 더 좋은 이유는 무엇입니까? 큰 "if else"테이블이있는 함수는 없지만 기본적으로 동일한 코드가 여전히 있지만 다른 장소로 옮겨지고 많은 다른 클래스에 분산되어 있습니다.
나중에 특정 연산자의 의미를 변경해야 할 수도 있고 런타임에 연산자를 다시 정의 할 필요가 있을지도 모른다고 생각했기 때문에이 점이주의를 끌었습니다. 또한 함수 호출을 연산자와 동일하게 취급하므로 런타임에 추가 할 수있는 점프 테이블과 같은 것이 좋을 것입니다.
내가 지금 보지 못하는 첫 번째 방법에는 아마도 상당한 이점이 있습니다. 누군가 그것을 지적 할 수 있습니까?
감사합니다. 언어에 새로운 연산자를 추가해야 할 때마다 파서와 평가자를 모두 변경해야한다는 점에 유의하십시오. – MAK