2012-12-10 6 views
2

간단한 (C와 유사한) 언어 용 컴파일러의 코드 생성 섹션을 작성하는 중입니다. "if"문에 문제가 있습니다. 나는 GCC와 마찬가지로 조건의 각 부분에 해당하는 점프 명령어를 생성하고 싶다. 부울 표현식의 구조를 유지하는 구조는 추상 구문 트리입니다.if 문에 대한 코드 생성

지금까지 필자는 비교와 논리적 및 논리적 부정을 위해 해당 레이블을 생성하는 함수를 작성했습니다. 그러나,이 기능을 논리적으로 또는 잘 작동 시키려고 할 때 커다란 문제가 있습니다. 간단한 문장에 대한

, 같은
if (25 < 19) then 
    print 99 
statements 

으로 내가 같이 내 코드를 싶습니다

cmp 25, 19 
jge label0 
label1: 
print 99 
label0: 
statements 

(내 기능이 간단한 예를 들어 유사 디스플레이 무언가를).

부정을 처리 할 때 이러한 조건에 대한 테스트를 무효화하면됩니다 (jge를 위의 jl로 변환). 논리적 인 경우, 왼쪽 및 오른쪽 결합에 해당하는 코드를 순차적으로 순차적으로 생성하면됩니다. 그러나 OR의 경우 여러 가지 어려운 문제에 직면 해 있습니다. if (또는 다음 else 브랜치) 이후의 명령문으로 점프하는 대신, 조건이으로 실패하면 다른 모든 경우와 마찬가지로 OR 피연산자 중 하나가 있으면 코드가있는 실제 위치로 점프해야합니다 . 그렇다면 두 개의 OR이있을 때 AST는 이진 노드를 사용하는 OR를 나타 내기 때문에 번역을 시도합니다.이 중급 표현을 사용하면이 AST를 사용합니다.

누구든지이 문제에 도움을 주시겠습니까? 나는 또한 'Engineering a Compiler'에 대한 컨설팅을 시도했지만 거기에서 유용한 것을 찾지 못했습니다.

답변

1

내가 학교에있을 때 이와 비슷한 일을 한 것을 기억합니다.

이러한 종류의 표현식에서 모든 조건에 대해 컴파일러에서 결과를 생성 한 다음 CPU에서 제공하는 "and"또는 "or"명령어를 사용하여 결과를 "병합"한 다음 "합병 된"결과.

+0

왜이 답변이 다운 보트를받을 자격이 되었습니까? –

+0

나는 누가 당신의 코멘트를 downvoted 모르겠다. 이 기법을 알고 있지만 직접 점프를 생성하려고합니다. – user1890481