2017-05-08 77 views
1

我用來餵了std::basic_stringstream<char>是 發送到構造我Quex供電詞法Quex的新版本,因爲這樣的:問題移植詞法分析器

typedef std::basic_stringstream<char> UStringStream; 
UStringStream tokenStream(sCode); 
quex::ecmascript_lexer ecmascript_lexer(&tokenStream); 

這個工作使用Quex 0.64.8,但是似乎API有因爲它似乎沒有與版本0.67.4一起使用,因此更改了 。

任何指示我應該如何將我的代碼移植到新版本 將不勝感激。

最好的問候,

帕特里克Ĵ

編輯:刪除有關串累加器的問題,它 將重新發布爲一個單獨的問題。

回答

0

這些其實是兩個問題。我們假設你編輯你的文本,以便 這個問題是關於新的構造函數API。對於累加器, 請發佈一個單獨的問題。

構造函數,include_push和reset的新API已完全重做 ,因此它可以處理任何類型的輸入。關鍵是 「ByteLoader」的抽象。 ByteLoader實現了 C-標準文件和流,POSIX文件描述符( - >用於套接字), 和從內存直接加載(在單元測試中很好地檢查大集合)。現在,這是如何使用?

您輸入的場景創建一個ByteLoader,即 '性病::流':

QUEX_NAME(ByteLoader)* byte_loader = QUEX_NAME(ByteLoader_stream_new)(&my_stream); 

然後將它傳遞給構造(或放置新):

MyLexer lexer(byte_loader, /* converter */0); 

如果你想在轉換內容上工作時,您可能必須創建一個轉換器並將其作爲第二個參數傳遞給 。因此, 完整代碼變得類似:

QUEX_NAME(ByteLoader)* byte_loader = QUEX_NAME(ByteLoader_stream_new)(&my_stream); 
QUEX_NAME(Converter)* converter = QUEX_NAME(Converter_IConv_new)("UTF-8", NULL); 
MyLexer    lexer(byte_loader, converter); 

這種類型的結構的詞法分析器的允許的靈活性最大 。對於C-Standard文件接口沒有限制, 輸入可以來自任何來源,例如套接字或串行線路。並且 輸入數據的轉換是在幕後進行的,而與緩衝區內容的同步完全由 詞法分析器完成。

請注意,構造函數將ByteLoader和Converter的所有權轉換爲詞法分析器。 沒有必要手動刪除它們

頁眉和ByteLoader-S和轉換器-S實現是 位於

$QUEX_PATH/quex/code_base/buffer/bytes/... 

$QUEX_PATH/quex/code_base/buffer/lexatoms/converter/... 

如果你有新的類型ByteLoader-S或轉換-S的,提交他們作爲 的補丁。一旦他們被測試,他們很可能會被輸入到 的代碼庫中。

+0

謝謝你,弗蘭克!一旦你知道它是如何工作的,新的API真的很乾淨:) – PatrikJ