문제

나는 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의 출력을 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top