bison 예제

Flex 스캐너 자체의 작동 방식은 이 자습서의 범위를 벗어납니다. 특히 C에서 스캐너를 시작하는 방법에 대한 많은 참조가 있습니다. 거기에 다른 예제가 많이 있지만 대부분의 경우 가기 위해 꽤 많은 작업이 필요하며 완료되지 않은 것으로 나타났습니다. 유닉스 단어 카운트 유틸리티 (wc)와 유사한 것을 만드는 다른 Flex / 들소 예제를 기반으로합니다. 내가 사용한 언어는 다음과 같은 면에서 wc와 약간 다릅니다 : 단어는 알파 문자일 뿐이며 숫자는 단순히 문자로 계산되며 대문자와 소문자수를 계산합니다. 이 간단한 플렉스 프로그램에서는 세 번째 섹션에 C 코드가 없습니다. 플렉스 라이브러리(-lfl)는 스캐너를 호출하는 작은 기본 프로그램을 제공하므로 이 예제에 적합합니다. 이제 모든 것을 인스턴스화하는 기본 클래스와 명령줄에서 컴파일을 실행하는 Makefile을 정의하는 것만 남았습니다(소스 코드 디렉토리에 확인을 입력하여 호출). 우리의 주요 클래스는 아마도 해야 할 것보다 조금 더 복잡하지만 스트림 예제와 파일 예제를 모두 하나에 포함시키고 싶었기 때문에 이를 위해 추가 한 두 플래그를 구문 분석하는 추가 코드가 있습니다.

argv 배열을 구문 분석하는 데 익숙한 사람에게는 비교적 자명해야 합니다. 파일 `rpcalc`에는 실행 코드가 포함되어 있습니다. 다음은 rpcalc를 사용하는 예제 세션입니다. 5호선은 yyFlexLexer를 정의하는 FlexLexer.h 클래스를 포함합니다. 그런 다음 토큰 정의를 포함하는 들소 생성 헤더 파일을 포함합니다. 생성자는 비교적 똑바른 앞으로, 우리는 단순히 yyFlexLexer 생성자 호출 다음 우리는 nullptr에 개인 yylval 포인터를 초기화. 이 간단한 예제에서 정의해야 하는 유일한 함수는 YY_DECL이전에 정의한 yylex가 있습니다. 한 가지 주의해야 할 점은 yylex()가 이제 가상으로 선언되고 자신의 함수를 정의할 때 재정의 오류를 throw할 수 있다는 사실입니다. 이 방법을 해결하려면 컴파일러가 24줄에 새 yylex를 정의해야 한다는 것을 알 수 있도록 using 문을 추가했습니다.

우리가 YY_DECL을 정의하지 않은 이유를 보여주기 위해 여기에 생성 된 lex.yy.cc 코드 조각이 있습니다 : 마찬가지로, 들소 파서는 특히 문법이 라는 들소의 검증으로 인해 동등한 필기 파서보다 훨씬 짧고 쉽게 디버깅할 수 있습니다. 명확한.