2016-08-24 71 views
1

我有一個C文件中像這樣的字符串:如何解析C字符串與野牛

char *test = "print x"; 

我想解析與Bison分析器我寫。可能嗎?

+0

最有可能的是。你試過什麼了?什麼不起作用? – Kninnug

+3

您需要配置您的詞法分析器,以便它將從字符串中讀取,標記它,並在達到最後時報告EOF(通過返回值0)。您可能需要一個初始化函數和'yylex()'代碼來讀取初始化集。 –

+0

我該怎麼做? – tejgop

回答

1

Bison解析器根本不讀取輸入。他們通過反覆調用yylex來獲得一系列令牌。 (或者,用現代野牛,你可以創建一個「推式解析器」,它在連續的調用中被賦予標記)。因此,無論什麼工具yylex負責輸入。

如果使用flex創建詞法,您可以使用yy_scan_string(或yy_scan_bytes如果你知道字符串是如何長)掃描字符串,而不是從一個文件掃描。有關這些功能的詳細信息,請參見Flex manual

舉個簡單的例子,你可以把以下兩個功能在您flex定義文件的末尾,第二%%後:

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

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

,並把這個在您的野牛定義文件的末尾,再次第二%%後:

/* 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'。修復了答案。請參閱[文檔](http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers) – rici

+0

有沒有這樣做的方式(從字符串讀取),而在中間從文件讀取而不重新啓動野牛的解析狀態?我可以很容易地從字符串中讀取flex,但是當它出現時,由於某種原因,bison會啓動一個新的解析堆棧,而不是繼續現有的堆棧。 – velocirabbit