나는 YACC (Bison) 문법, Lex (Flex) 토크 나이저 및 C 언어 프로그램 중 struct
(또는 실제로 모든 변수)을 공유해야합니다. 현재 문법 파일에 실제 객체를 선언하고 어느 곳에서든지 (보통은 C 소스 파일) 필요에 따라 extern
포인터를 사용하여 객체를 조작합니다. C 파일과 문법 파일 사이에 공유 된 헤더 (및 구현) 파일이있어서 내 데이터 구조를 조작하는 데 유용한 기능이 있습니다. 이것은 효과가 있지만 조금 불편한 느낌입니다. 문법과 프로그램간에 메모리를 공유하는 더 좋은 방법이 있습니까?YACC, Lex 및 C 파일간에 메모리 공유
4
A
답변
4
필요한 소스 파일간에 extern 선언을 공유하는 헤더 파일이 가장 좋은 방법입니다. 주요 대안은 '기능적 접근'을 제공하는 것입니다. 즉, 일종의 '가치 획득'과 '가치 설정'기능 (또는 기능 집합)을 제공하는 것입니다. 이것은 보통 잔인합니다. 불일치가 가능한 빨리 발견 될 수 있도록 문법 (변수 정의 위치)과 렉서 (lexer) 및 다른 코드에 헤더를 포함하십시오.
2
표준 (POSIX) lex/yacc를 고수하려면 전역 변수/함수로 이동하는 것이 유일한 옵션입니다. Bison과 Flex 확장을 사용하는 것이 좋다면, yyparse()와 yylex()에 여분의 매개 변수를 추가하는 것과 관련하여 변수를 전달하는 몇 가지 방법이 있습니다.
들소에서 이것은 % lex-param과 % parse-param을 통해 수행됩니다.
플렉스에서%parse-param { struct somestruct *mystruct }
%lex-param { struct somestruct *mystruct }
, 당신은 재진입 렉서를 원하거나하지 여부에 따라 두 가지 메커니즘이있다. 기본 (비 재진입) 옵션으로 이동 가정 할 때, 당신은 YY_DECL을 다시 정의 할 수 있습니다 : 재진입 플렉스 렉서에서
%{
#define YY_DECL int yylex(struct somestruct *mystruct)
%}
을, 여분의 인수는 플렉스는 계속 주위를 운반하는 스캐너 구조체를 통해 추가 할 수 있습니다 그 상태. YY_EXTRA_TYPE을 정의하고자합니다. 추가 데이터는 yyget/set_extra()를 통해 액세스 할 수 있습니다.