2013-06-03 3 views
1

C++ m4 매크로 사용과 관련하여 질문이 있습니다. 나는 다른 사람의 코드를 컴파일하려고하고 헤더 파일 중 하나처럼 보이는 라인이 오전 :Flex와 Bison을 사용하여 C++ 헤더 파일을 생성 할 때 m4를 사용하는 방법?

error: expected constructor, destructor, or type conversion before ‘(’ token 
:이 코드를 컴파일 할 때 물론이 오류를 반환

b4_copyright(C++ Skeleton parser for LALR(1) parsing with Bison, 2002, 2003) 

들소의 설치에서 c.m4 파일 b4_copyright의 정의는 다음과 같습니다

m4_define([b4_copyright], 
[/* A Bison parser, made by GNU Bison b4_version. */ 

/* $1 

m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [ ]) 

... 

This special exception was added by the Free Software Foundation in 
version 2.2 of Bison. */]) 

나는 오류가 헤더 파일은 플렉스 및 BI에 의해 생성 될 때 생기는 일이라고 생각 아들. 어떤 이유로 Bison이 파싱 된 코드를 처리 할 때 m4 매크로 (이 경우 b4_copyright)의 출력을 억제하지 않습니다. 헤더 파일을 생성 할 때 실행 된 매크로의 표준 출력으로부터 라인을 남겨 둡니다. 왜 그랬을까요?

b4_copyright의 정의가있는 c.m4 파일에 따르면 출력이 표시되지 않아야합니다. c.m4 파일은 m4sugar.m4의 정의도 사용합니다. 그러나이 정의는 m4_divert 함수 (m4sugar.m4에 정의되어 있음)를 사용하여 출력을 억제하지 않기 때문에 c.m4 파일의 어느 부분에도 적용되지 않습니다.

+0

문제점을 발견했습니다. 코드를 생성하는 데 사용 된 lex 스켈레톤 파일에서, 저의 앞에있는 사람은 c4 파일에 m4_include를 추가하는 것을 잊었습니다. 이 문제를 해결할 때마다 내 문제가 수정되었습니다. –

답변

2

귀하의 문제는 매우 놀랍습니다. 사용자가 열심히 노력하더라도 이러한 내부 세부 정보에 결코 노출되어서는 안됩니다! 특히, Flex로 원하는 모든 작업을 수행 할 수 있으므로 Bison은 안정된 상태를 유지해야합니다. Flex 파일을 읽을 필요가 없습니다.

정말 M4 설치가 잘못되었거나 누군가 Bison 스켈레톤 파일로 재생되었지만 (결코 일어나지 않아야 함). 다른 경우에는 버그이며 적절한 목록에보고해야합니다 (gnu.org의 bug-bison).