참고 : 제목에 "복합체"를 사용하면 표현식에 많은 연산자와 피연산자가 있습니다. 표현 자체가 복잡한 것은 아닙니다.
최근에 x86-64 어셈블리에 대한 간단한 컴파일러를 연구하고 있습니다. 컴파일러의 메인 프론트 엔드-lexer 및 parser를 마쳤으며 이제 내 프로그램의 추상 구문 트리 표현을 생성 할 수 있습니다. 그리고 제 언어는 정적으로 타이핑 될 것이기 때문에, 이제 다음 단계를 수행하고 있습니다 : 소스 코드 타입 점검. 그러나 문제가 생겨서 스스로 해결할 수 없었습니다.
다음 예제를 고려하십시오.
내 컴파일러 파서가 다음 코드 줄을 읽었습니다.
int a = 1 + 2 - 3 * 4 - 5
그리고 다음 AST로 변환했습니다.
=
/ \
a(int) \
-
/ \
- 5
/ \
+ *
/ \ / \
1 2 3 4
이제 AST를 확인해야합니다. 먼저 =
연산자를 점검하여 시작합니다 . 먼저 운전자의 왼쪽을 확인합니다. 변수 a
가 정수로 선언 된 것을 볼 수 있습니다. 따라서 오른쪽 표현식이 정수로 평가되는지 확인해야합니다.
표현식이 1
or 와 같은 단일 값인 경우 어떻게 할 수 있는지 이해합니다 'a'
. 그러나 여러 값과 피연산자가있는 표현식 (복잡한 표현식)이 위와 같이 어떻게 수행됩니까? 식의 값을 올바르게 결정하려면 형식 검사기가 실제로 식 자체 를 실행 하고 결과를 기록 해야하는 것처럼 보입니다 . 그러나 이것은 분명히 컴파일과 실행 단계를 분리하는 목적을 무너 뜨리는 것 같습니다.
내가 할 수 있다고 생각하는 유일한 다른 방법은 AST에서 각 하위 표현식의 리프를 재귀 적으로 확인하고 모든 리프 유형이 예상 연산자 유형과 일치하는지 확인하는 것입니다. 따라서 =
연산자 부터 시작 하여 형식 검사기는 왼쪽의 모든 AST를 모두 스캔하고 리프가 모두 정수인지 확인합니다. 그런 다음 하위 표현식의 각 연산자에 대해이를 반복합니다.
필자는 "The Dragon Book" 사본에서 주제를 연구하려고 시도했지만 자세한 내용은 다루지 않고 이미 알고있는 내용을 반복해서 보여줍니다.
컴파일러가 많은 연산자와 피연산자가있는 식을 검사 할 때 일반적으로 사용되는 방법은 무엇입니까? 위에서 언급 한 방법 중 사용 된 것이 있습니까? 그렇지 않은 경우 방법은 무엇이며 어떻게 작동합니까?
double a = 7/2
은 오른쪽을 이중으로 해석하려고 시도하므로 분자와 분모를 이중으로 해석하고 필요한 경우 변환합니다. 결과적으로 a = 3.5
. 상향식은 정수 나누기를 수행하고 마지막 단계 (할당)에서만 변환하므로 a = 3.0
.
int a = 1 + 2 - 3 * 4 - 5
만에int a = 5 - ((4*3) - (1+2))