2011-02-06 55 views
1

即使世界一點點的C代碼是這樣的:柔性野牛Ç的lex yacc的掃描字符串緩衝區

int doCommand(char* command) 
{ 
    // +2 on strlen is for the two extra '\0' characters 
    // needed by flex when scanning strings. 
    YY_BUFFER_STATE yybs = yy_scan_buffer(command, strlen(command)+2); 
    yy_switch_to_buffer(yybs); 
    yyparse(); 
    yy_delete_buffer(yybs); 
} 

它被稱爲一個循環像(僞代碼):

read characters upto and including '\n' into a buffer; 
add two '\0' characters; 
call doCommand(buffer); 
zero the buffer; // NOTE: same buffer will be used next loop. 

什麼不順心的在第一個命令處理成功後,輸入的任何其他命令都不會被處理。

我已經打印出yylineno(當flex掃描儀看到'\ n'時它會增加),它只會在第一個命令後增加一次。

我無法弄清楚,如果它是什麼我做了錯誤的Flex,或者如果它是yyparse停止調用掃描儀後第一次去。

如果有人能夠確切地指出發生了什麼,我會很高興。

回答

2

你可以請嘗試與調試?檢查讀取哪些令牌。它是否及時切換,輸入是什麼。

我不使用flex增強功能,因爲我需要可移植性,所以我通過YY_INPUT來實現此機制有點不同。生成的令牌可能與您所期望的不同,因此我建議先調試lex部分。

+1

你好,再次感謝您的回覆,並提示使用yydebug。事實證明,這與flex或yyparse無關,它是我在循環中的字符串重置函數。它將index-where-next-character-重置爲0,但由於我的字符串添加字符的工作方式,它需要重置爲-1 ......所以我傳遞的字符串以'\ 0'掃描儀,它顯然沒有工作。 – 2011-02-06 16:26:18