다수의 플렉스/들소 파서
-
06-07-2019 - |
문제
프로젝트 내에서 여러 개의 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로 이름이 바뀝니다.