2012-03-13 5 views
2

컴파일러 (어휘, 구문 및 의미 분석기)를 구현해야합니다. 나는 플렉스 ++에서 어휘를 이미 구현했다. 재귀 적 (recursive descent)에서 구문을 구현했으며, 의미론 (기존 파서에 의미 규칙을 추가)을 수행하고 있음을 알고있다. 내 질문은 - 속성을 어떻게 구현합니까? 생산을위한 예를 들어 , 모든 문법 기호에 대한 등등 그래서 여기 내가 TYPE에 대한 몇 가지 구조를 만들 필요가C에서 구현되는 문법 심볼 속성

TYPE.type = integer 

및 :

TYPE -> integer 

나는 의미 규칙을 추가해야합니다. 그런 구조를 어떻게 구현합니까? 각 문법 기호에 대해 구조체를 만들어야하고 파일 범위에 대해 전역 적이어야합니까?

p.s. 어쩌면 그것은 최상의 컴파일러 구현이 아니며, 할당을위한 요구 사항 일뿐입니다.

답변

2

각 터미널에 유형 (일반적으로 구조체)을 정의하고 해당 언어로 비 터미널을 정의하는 것이 가장 쉽습니다. 그런 다음 (비) 터미널의 각 사용은 해당 유형에 대한 액세스 권한을 가지며 속성의 각 할당은 (비) 터미널과 관련된 구조의 해당 슬롯에 대해 수행됩니다.

문법 토큰을 사용하여 구현 구조의 이름을 지정하는 것이 좋습니다. 따라서 T의 속성 구조 유형은 "T_attributes {...}"가됩니다.

예를 들어, "type"은 T_attributes의 슬롯입니다. 아마 당신이 추상적으로 작성하는 것을 의미하는 것은이었다

TYPE -> 'integer' ; -- 'integer is a keyword' 
TYPE.type = "int"; -- the type of an 'integer' is "int" 

당신이 손으로이 일을 감안할 때, 당신은 나무 도보 유형 노드를 칠 때 실행 속성 할당을 손으로 컴파일됩니다.