문제
나는 C에서 Lexer를 만들고 싶고 나는 용 책, 나는 국가 전환을 이해할 수 있지만이를 구현하는 방법은 무엇입니까?
더 나은 책이 있습니까?
문자열이 허용되는지 아닌지 알 수 있도록 여러 상태를 통해 문자열을 구문 분석해야한다는 사실!
해결책
g'day,
컴파일러 디자인에 대한 Dragon Book을 의미한다고 가정하면 둘러 보는 것이 좋습니다. 이 페이지 컴파일러 도구에서.
페이지 자체는 매우 작지만 어휘 분석기의 다양한 우수한 리소스에 대한 링크가 있습니다.
HTH
건배,
다른 팁
단일 상태 변수로 간단한 상태 전환을 구현할 수 있습니다. 예를 들어 상태 시작-> part1-> part2-> 끝을 통과하려면 열거를 사용하여 현재 상태를 추적하고 스위치 문을 사용할 수 있습니다. 각 상태에서 실행하려는 코드의 경우.
enum state { start=1, part1, part2, end} mystate;
// ...
mystate = start;
do {
switch (mystate) {
case start:
// ...
case part1:
// ...
case part2:
// ...
if (part2_end_condition) mystate = end; // state++ will also work
// Note you could also set the state back to part1 on some condition here
// which creates a loop
break;
}
} while (mystate != end);
여러 변수에 의존하는보다 복잡한 상태 전환의 경우 다음과 같은 테이블/어레이를 사용해야합니다.
var1 var2 var_end next_state
0 0 0 state1
0 1 0 state2
1 0 0 state3
1 1 0 state4
-1 -1 1 state_end // -1 represents "doesn't matter" here
이를 수행하는 방법은 여러 가지가 있습니다. 모든 정규 표현식은 간단한 구조화 된 프로그램에 직접 해당합니다. 예를 들어, 숫자에 대한 표현식은 다음과 같습니다.
// regular expression
digit* [.digit*]
그리고 해당 C 코드는 다음과 같습니다.
// corresponding code
while(DIGIT(*pc)) pc++;
if (*pc=='.'){
pc++;
while(DIGIT(*pc)) pc++;
}
Lexers를 구축하는 전환 테이블 방법은 제 생각에 불필요하게 복잡하며 분명히 느리게 실행됩니다.
Dragon Book보다 더 현대적인 대우를 찾고 있다면 Andrew W. Appel과 Maia Ginsburg, Modern c.의 컴파일러 구현, Cambridge University Press, 2008.
2 장에서는 어휘 분석에 중점을 둡니다 : 어휘 토큰, 정규 표현, 유한 automata; 비 결정적 유한 유한 자동 카타; 어휘 분석기 생성기
를보세요 목차
FLEX (LEX의 클론) 프로그램은 Lexer를 만들 것입니다.
Lexer 규칙이있는 입력 파일이 주어지면 해당 규칙에 대한 Lexer를 구현하여 C 파일을 생성합니다.
따라서 C.에서 Lexer를 쓰는 방법에 대해 Flex의 출력을 확인할 수 있습니다.