문제

프로젝트 내에서 여러 개의 Flex/Bison 파서를 처리하는 가장 좋은 방법은 무엇입니까?

나는 파서를 썼고 이제 같은 프로젝트에서 두 번째가 필요합니다. 지금까지 세 번째 섹션에서 parser1.y 나는 삽입했다 main(..) 방법 및 호출 yyparse 거기에서.

내가 얻고 싶은 것은 두 개의 다른 파서가있는 것입니다 (parser1.y 그리고 parser2.y) 그리고 외부 함수에서 사용할 수 있습니다 (가정하자 main 안에 main.cpp).

수출에 어떤 예방 조치를 취해야합니다 yyparse 외부 기능 .y 파일과 두 개의 구획을 어떻게 처리해야합니까?

추신. C ++ 버전의 Flex 및 Bison은 G ++를 사용하고 있으며 이런 식으로 유지하고 싶습니다 (따라서 객체 내부의 파서를 캡슐화하는 것을 피).

도움이 되었습니까?

해결책

Bison은 'yy'대신 'zz'로 기호를 접두사하기위한 '-p zz'옵션을 제공합니다.

마찬가지로 Flex는 'yy'대신 'zz'로 기호를 접두사하기위한 '-p zz'옵션을 제공합니다. 성능보고에 '-p'를 사용합니다. '동정심은 서로 일치하지 않습니다.

다른 팁

Leffler의 답변 외에도 여기에 또 다른 접근 방식을 제공하고 싶습니다.

에서 .lex 사용할 수있는 파일 %option prefix="PREFIX", 그리고, 그리고 .y 사용할 수있는 파일 %define api.prefix PREFIX, 통과와 같은 일을합니다 -p PREFIX 들소와 -P PREFIX 굴곡.

기본 접두사를 재정의 한 후에는 주목하십시오 yy, 당신은 원본을 통해 내부 이름에 액세스 할 수 있습니다. yy* 그리고 당신의 우선 PREFIX*, 분명히 외부 이름을 위해서는 당신은 당신의 PREFIX* 액세스하기 위해.

Bison 3.0 이상을 사용하면 %define api.prefix {foo_}, 모든 것을 대체합니다 yy 그리고 YY 접두사 foo_ 그리고 FOO_.

참조 여러 파서에 대한 문서.

Bison 2.6과 3.0 사이에 교정기가 없었습니다. %define api.prefix foo_.

API.prefix 변수가 더 이상 작동하지 않습니다 (컴파일 오류를 생성합니다)

%define api.prefix {PREFIX}

다음 구문을 사용해야했습니다

%name-prefix="PREFIX"

이미 언급 된 내용 외에도 '%Define API.prefix {prefix}'를 사용하면 yytext && yyparse를 prefixtext 및 prefixparse로 바꿉니다. 접두사 주변의 {}를 잊지 마십시오!
Lex의 '%옵션 Prefix = "Prefix"'에도 동일하게 적용되며 Lexer의 이름이 PrefixLex로 이름이 바뀝니다.

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