나는 라이브러리를 수정하지 않고 C++ 코드에서 인터페이스하고 싶은 C 라이브러리를 가지고있다. yacc에서 생성 한 프런트 엔드는 yyin
이고 FILE *
입니다. yyin
을 에뮬레이션으로 설정하고 싶습니다. 메모리에서 읽는 FILE *
입니다. 휴대용 (Linux, Mac, Windows) 방식으로이 작업을 수행 할 수있는 희망이 있습니까? 아니면 FILE *
이 아닌 메모리에서 파서를 읽는 다른 방법이 있습니까?yyin을 "에뮬레이트 된"FILE *로 설정하십시오.
답변
Linux에서는 fmemopen()
을 사용할 수 있습니다. 불행히도이 방법을 사용할 수있는 휴대용 방법이 없을뿐만 아니라 fopen()
도 실제로 이식 할 수 없습니다 (Windows에서는 오랫동안 손상되었습니다).
그러나 토크 나이저가 Flex 인 경우 yy_scan_buffer()
을 사용할 수 있습니다. String input to flex lexer을 참조하십시오.
그게 훌륭합니다, 고마워요. 나는이 모든 잘못에 대해 생각하고있었습니다. 자바 물마루에서 너무 오래 먹어서, 나는 두렵다. –
오늘'yy_scan_string()'에서이 작업을했습니다. 다시 한번 감사드립니다! –
yacc 스캐너는 일반적으로 lexer를 통해 토큰을 가져오고 yylex
이라는 함수를 호출합니다.
렉서는 일반적으로 입력 파일 (또는 귀하의 경우 버퍼)에서 문자를 읽습니다. 렉서를 생성하기 위해 Flex를 사용한다고 가정하면, 입력을 읽는 방법을 수정하기위한 일반적인 "후크"는 YY_INPUT
매크로를 재정의하는 것입니다.
그러나 @dietrich Epp가 언급 한 것처럼 yy_scan_string, yy_scan_buffer 및 yy_scan_bytes도 있습니다. 자신의 YY_INPUT을 정의하는 것보다 자신의 목적에 더 적합한 지 여부는 약간의 질문에 개방적 일 수 있습니다. 내가 세부 사항을 기억할 수는 없지만, 내 기억은 효율성에 대한 (적어도 인식 된) 부족 때문에 때때로 그들을 피하는 것입니다. (또는 YY_INPUT을 정의하는 것이 더 쉬웠다 고 생각한 것일 수도 있습니다. 확실히 기억하십시오).
'YY_INPUT'을 사용할 때의 문제점은'flex' 입력 파일이 이미 그것을 정의했기 때문에 (필연적으로) 내 목표는 소스를 수정하지 않고 라이브러리를 사용하는 것입니다. 지금, yy_scan_X() 함수를 수정되지 않은 코드로 작업 할 수 있는지 알아 내려고합니다. –
yacc 프런트 엔드에도 lex/flex 생성 토크 나이저가 있습니까? –
필요에 따라 외부 파일에서 데이터를 읽으려고 계획하고 있습니까, 아니면 전체 문자열을 스캔하여 메모리에 저장합니까? – templatetypedef
@BryanOlivier, 예, lex 토크 나이저가 있습니다. –