2010-11-24 6 views
2

나는 flex와 함께 렉서를 생성했다.(f) lex에 대한 자신의 파서를 작성하는 방법?

[ \t\n\r\v]   /* skip whitespace */ 

[_a-zA-Z]([_a-zA-Z]|[0-9])* printf("IDENT\n"); 
[0-9]+  printf("INTEGER\n"); 
[0-9]+\.  printf("DOUBLE\n"); 

이제 C에서 자체 파서를 작성하려고하지만 렉서에서 토큰을 얻는 방법을 모르겠습니다. "lexer.c"에 yylex() 호출을 포함시켜야합니까? 그렇다면 printf()를 호출하는 대신 열거 형을 반환해야합니다. bison/yacc을 사용하지 않고이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

GNU 버전의 도구에 대한 무료 GNU 문서가 실제로 없습니까? 온라인 버전이있는 O'Reilly의 책도 있습니다. (필자는이 질문을 대답이 아닌 주석으로 게시하고 있는데, 그 이유는 바로 참조가 없기 때문에 나는 그들을 보았던 것을 기억하는 것 같다.) –

답변

1

당신은 당신이 완료하기 전에 문법을 확장해야합니다,하지만 ...

  • 예,
  • (또는 더 나은/가능성, 유지
  • 적절한 return 문으로 printf() 문을 대체합니다 print 문과 return 문 추가).
  • '{ ... }'중괄호에 작업을 래핑합니다.
  • 토큰 유형과 토큰 값을 파서로 다시 전달하는 방법을 고려해야합니다.

표준 방법은 yylex() - Flex에서 생성되는 함수에서 토큰 유형을 반환하는 것입니다. 토큰 값을 전달하는 데 사용할 수있는 전역 변수 ylval이 있습니다. 유형을 제어 할 수 있습니다. 어딘가에있을 때, 토큰 번호 (토큰 유형)를 지정해야합니다. 이는 열거 형 또는 일련의 #defines 일 수 있습니다. 고전적으로, 정보는 구문 분석기에 의해 어휘 분석기에 제공됩니다. 즉, Yacc는 사용할 것으로 예상되는 토큰 번호의 목록을 제공하고 Flex는 해당 번호를 사용합니다 (또는 더 정확하게는 Flex에서 생성 된 코드의 return 문에 해당 번호를 사용합니다).

렉서에서 파서로 토큰을 받으려면 yylex()으로 전화해야합니다. 파서에서 별도로 컴파일하면됩니다. 실제로 원한다면 생성 된 소스를 파서 파일에 포함시킬 수도 있습니다.

관련 문제