2016-08-24 7 views
1

와 C의 문자열을 구문 분석합니다. 가능한가?어떻게이 같은 C 파일에 문자열을 가지고 들소

+0

대체로 그렇습니다. 지금까지 뭐 해봤 어? 작동하지 않는 것은 무엇입니까? – Kninnug

+3

어휘 분석기를 구성하여 문자열에서 읽고 토큰 화하며 끝 부분에 도달하면 EOF를보고합니다 (반환 값 0을 통해). 초기화 함수를 읽을 필요가 있고'yylex()'코드가 필요합니다. –

+0

어떻게하면됩니까? – tejgop

답변

1

바이슨 파서는 입력을 전혀 읽지 않습니다. 그들은 단순히 반복적으로 yylex을 호출하여 일련의 토큰을 얻습니다. (또는 현대 바이슨의 경우 연속 호출에서 토큰을받는 "푸시 구문 분석기"를 만들 수 있습니다.) 따라서 무엇이든 구현하면 yylex이 입력을 담당합니다. 당신은 어휘 스캐너를 만들 flex를 사용하는 경우 (당신이 문자열이 얼마나 오래 알고있는 경우 또는 yy_scan_bytes)

, 당신은 파일에서 문자열 대신 스캔을 스캔 yy_scan_string를 사용할 수 있습니다. 이러한 기능에 대한 자세한 내용은 Flex manual을 참조하십시오. 다시,

void set_input_string(const char* in) { 
    yy_scan_string(in); 
} 

void end_lexical_scan(void) { 
    yy_delete_buffer(YY_CURRENT_BUFFER); 
} 

을 그리고 당신의 들소 정의 파일의 마지막에이를 넣어 :

간단한 예를 들어, 두 번째 %% 후, 당신의 flex 정의 파일의 끝에 다음 두 가지 기능을 넣을 수 두 번째 %% 후 :

/* Declarations */ 
void set_input_string(const char* in); 
void end_lexical_scan(void); 

/* This function parses a string */ 
int parse_string(const char* in) { 
    set_input_string(in); 
    int rv = yyparse(); 
    end_lexical_scan(); 
    return rv; 
} 

그럼 당신은 선언하고 문자열을 구문 분석 parse_string를 사용할 수 있습니다.

+0

이 오류 받기 : '오류 : 선언되지 않은 식별자 사용'yy_free_buffer'' – tejgop

+0

@TejGop : 기억 경련은 죄송합니다. 'yy_delete_buffer'입니다. 답변이 수정되었습니다. [docs] (http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers) – rici

+0

중간에있는 동안이 작업을 수행하는 방법은 무엇입니까 (문자열에서 읽기) 들소의 구문 분석 상태를 다시 시작하지 않고 파일에서 읽는 방법? 문자열에서 flex를 쉽게 읽을 수는 있지만, 그럴 경우 bison은 기존의 구문 분석 스택을 계속 사용하지 않고 완전히 새로운 구문 분석 스택을 시작합니다. – velocirabbit