나는 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()를 통해 액세스 할 수 있습니다.
관련 문제
- 1. 동적 메모리 할당이없는 Lex 및 Yacc
- 2. lex/yacc 및 파서/스캐너
- 3. 활성 Lex 및 Yacc IRC가 있습니까?
- 4. Antlr의 장점 (lex/yacc/bison과 비교)
- 5. Lex Yacc, 문자 리터럴을 토큰 화해야합니까?
- 6. flex/lex yacc/bison 멀티 스레드 환경
- 7. lex/yacc 형식의 Java 문법 찾기
- 8. Lex/Yacc : 입력하기 전에 메시지 인쇄
- 9. yacc이 줄이는데 실패했습니다 (파이썬 Lex-Yacc)
- 10. C - fork() 및 공유 메모리
- 11. Windows, Visual C++ 2008에 LEX/YACC 또는 flex/bison 설치
- 12. Emacs TAGS 테이블은 lex/yacc 파일의 #line 지시어로 혼동합니다.
- 13. YY_BUFFER_STATE를 포함하도록 lex & yacc (solaris)에 어떤 라이브러리를 연결해야합니까?
- 14. Visual Studio 및 공유 메모리
- 15. 어떻게 파일간에 C# DllImport 함수를 공유 할 수 있습니까?
- 16. Xcode에서 Yacc과 Lex 사용하기
- 17. C 공유 메모리 포인터 매핑
- 18. 공유 메모리 초기화 문제 (c)
- 19. 부스트, 공유 메모리 및 벡터
- 20. solaris lex 오류
- 21. 메모리 매핑 파일이없는 공유 메모리
- 22. yacc 코드를 컴파일하려고합니다.
- 23. C++에서 공유 메모리 관리자를 구현하려면
- 24. 공유 메모리 STL 맵
- 25. 공유 메모리, 파일에 쓰기
- 26. 공유 라이브러리 메모리 공간
- 27. C++ 용 분산 공유 메모리 라이브러리?
- 28. c 해시 테이블을 공유 메모리 세그먼트에 넣기
- 29. 간단히 정수를 공유 메모리 세그먼트에 저장 : C
- 30. 포크를위한 공유 메모리