2014-10-06 59 views
0

我的解析器符合以下錯誤時,遇到一個非常大的令牌: 「輸入緩衝區溢出,無法放大緩衝,因爲掃描儀使用拒絕」FLEX讀取大令牌時,遇到緩衝區溢出錯誤

1)默認YY_BUF_SIZE是16k,如果我把這個值改大一點也沒有錯,但是它不能保證下次可以,因爲輸入可以有更大的標記;另外我發現如果我放大YY_BUF_SIZE值,解析器性能會受到影響,並且比以前更慢。

2)yytext應該是從the instructions here%指針來克服這個錯誤,但我試過了,它沒有工作。似乎我的yytext已經是指針。

任何人都可以幫助我解決這個問題嗎?我認爲Flex應該允許用戶無限的令牌大小,這取決於系統內存或動態內存堆棧容量。非常感謝您的任何建議或意見!

回答

2

錯誤消息告訴你你需要知道什麼,我想。通常,flex可以將緩衝區的大小調整到可用內存的限制,但如果使用REJECT操作(因爲掃描程序需要維護狀態堆棧以實現REJECT並且狀態堆棧不可調整大小),情況並非如此。

一般而言,flex未針對巨大的令牌進行優化,並且在某些情況下,巨大的令牌可能會使相對較慢的flex減慢。 REJECT也減緩flex下跌。所以你最好的解決方案是避免匹配巨大的令牌;例如,字符串和註釋可以一次一行地標記化,而不是被標記爲一個巨大的標記。

如果你真的需要能夠處理任意長的單一令牌,你必須弄清楚如何避免REJECT