2014-02-14 10 views
2

저는 컴파일러 과정을 수강 중이며 소개를 되풀이하고 있습니다. 컴파일러 프로세스가 어떻게 작동하는지에 대한 일반적인 개요입니다.파서 나 렉서가 심볼 테이블을 생성합니까?

그러나 나는 조금 혼란스러워합니다.

내 과정에서 "어휘 분석기는 일반적으로 특정 소스 언어 개념에 대한 정보를 저장/가져 오기 위해 기호 테이블에 액세스합니다"라고 명시되어 있습니다. 그래서 이것은 렉서가 실제로 심볼 테이블을 만들 것이라고 믿게 만듭니다. 내가 보는 방식으로 그는 토큰을 만들고 min 테이블을 저장하고 그것이 어떤 유형의 심볼인지를 설명합니다. "x -> VARIABLE"과 같습니다.

Google 검색을 통해 읽을 때 파서가 생성 한 사실에 대한 막연한 정보 만 찾을 수 있습니다. 그러나 구문 분석 단계는 렉서 단계 이후에옵니다. 그래서 나는 약간 혼란 스럽다.

Symbol Table Population after parsing; Compiler building

http://www.cs.dartmouth.edu/~mckeeman/cs48/mxcom/doc/Symbols.html 가 말한다 (미국 파서는 테이블을 채우는) "심볼 테이블은 구문 트리를 도보로 내장되어 있습니다.". 구문 트리는 파서에 의해 생성됩니다. (파스 트리). 파서가이 기호 테이블을 사용하기 전에 실행되는 렉서는 어떻게 할 수 있습니까?

나는 렉서가 변수의 범위와 기호 탭 내에 포함 된 다른 정보를 알 수 없다는 것을 알고 있습니다. 따라서 파서가이 정보를 테이블에 추가한다는 것을 알고 있습니다. 그러나 렉서는 단어가 변수인지, 선언 키워드인지 등을 알고 있습니다. 따라서 부분 (?) 기호 테이블을 작성할 수 있어야합니다. 아마도 심볼 테이블의 일부를 구성 할 수 있을까요?

답변

5

혼란의 일부는 "기호 표"가 다른 사람들에게 다른 사물을 의미하며 잠재적으로 컴파일 과정의 다른 단계에 있다는 것을 의미합니다.

일반적으로 렉서는 입력 스트림을 토큰 (종종 어휘 또는 터미널이라고도 함)으로 나눕니다. 당신이 말했듯이 이들은 서로 다른 유형, 숫자, 키워드, 식별자, 구두점 기호 등으로 분류 될 수 있습니다.

렉서는 인식 된 식별자 토큰을 심볼 테이블에 저장할 수 있지만 렉서는 일반적으로 식별자의 의미를 알지 못하기 때문에 동일한 식별자가 다른 컴파일 범위에서 서로 다른 것을 의미 할 수 있으므로 종종 파서입니다 - 더 많은 문맥 지식을 가진 - 기호 테이블을 작성하는 책임이 있습니다.

그러나 일부 컴파일러 디자인에서는 렉서가 구문 분석기 (또는 요청시 입력 스트림의 구문 분석기 요청 토큰)로 전달되는 토큰 목록을 간단히 작성하고 파서는 차례로 구문 분석 트리를 생성합니다 또는 때로는 추상 구문 트리)를 출력으로 가져온 다음 심볼 테이블은 구문 분석 트리를 통과하여 특정 컴파일 단위에 대한 구문 분석이 완료된 후에 만 ​​빌드됩니다.

많은 다른 디자인이 가능합니다.

관련 문제