렉서 단계에서 기호 표를 작성해야하는 이유가 있습니까?기호 표 작성에 적합한 단계
flex & bison: Text Processing Tools 책에서 저자는 간단한 기호 테이블을 작성하려는 시도로 렉서의 예를 제시합니다.
/* declaration keywords */
auto |
char |
int |
/* ... skip ... */
volatile { defining = 1; }
/* ... skip ... */
/* punctuators */
"{"|"<%"|";"
{ defining = 0; }
이 솔루션은 더 복잡한 경우에서 작동하지 않습니다 같은 int a = b, c = d;
(기호 c
이 정의로 표시되지 않습니다)의 참조에서 기호 정의를 구별하는 다음 코드에서 해결 방법이있다. 이 외에도 중첩 된 범위는 렉서 단계에서 처리 할 수 없습니다.
질문에서 lex and yacc (symbol table generation) lexer의 기호 테이블 액세스는 일반적인 것이지만 나는 여전히 프로가 보이지 않으며 왜 나중에 lexer에 내장 된 테이블이 유용할지 알 수 있습니다.
매우 분명한 동기이지만 한 가지 질문이 남아 있습니다. 왜 '정의'플래그를 렉서 규칙에 넣어야합니까? 저자의 예는 극히 간단하며이 해결 방법은 일을 끝내기에 충분합니다. – Unforgiven
@unforgiven : 스 니펫은 flex 만 사용하여 작성된 예제 도구에서 가져온 것입니다. 이 도구는 심볼의 정의와 심볼 사용을 상호 참조하려고 시도합니다. 소스 텍스트를 실제로 파싱하지 않기 때문에 주어진 식별자 사용이 정의인지 또는 사용인지를 결정하기위한 어휘 힌트에 의존합니다. 그 내용은 본문에서 설명되어 있습니다. – rici