2009-05-28 35 views
2

看來flex不支持UTF-8輸入。每當掃描器遇到非ASCII字符時,就會停止掃描,就好像它是EOF一樣。如何使flex(詞法掃描儀)讀取UTF-8字符輸入?

有沒有辦法強制flex吃我的UTF-8字符?我不希望它實際上匹配UTF-8字符,只是在使用'。'時吃掉它們。模式。

有什麼建議嗎?

EDIT

最簡單的解決辦法是: ''

ANY [\ x00- \ XFF]

和使用 'ANY',而不是在我的規則。

+0

如果它工作,很棒:)適當的unicode支持將是不錯的壽。 – 2009-05-28 17:19:36

+0

同意。我現在正在運行一個不同的問題,Flex檢查「if(yychar <= YYEOF){/ *掃描結束* /}」,但我的UTF-8字符是負數( – 2009-05-28 18:32:56

+0

)您將遇到大量問題。在內部,它將是一個重寫ECS代碼,表生成器和任務的任務,可能會更好地從頭開始:P想要幫助嗎? – 2009-05-28 19:57:17

回答

6

我一直在尋找這個自己和閱讀Flex郵件列表,看看有沒有人想過。讓Flex閱讀unicode是一件複雜的事情...

UTF-8編碼可以完成,而其他大多數編碼(16s)將導致大量的表格驅動自動機。

的常用方法,到目前爲止是:

我所做的只是簡單的寫單UTF-8字符 匹配的模式。他們看起來像 以下,但你可能想 重新讀取UTF-8規範 ,因爲我很久以前寫這個。
你當然需要結合 這些因爲你想要unicode字符串, 不只是單個字符。

UB [\200-\277] %% 
[\300-\337]{UB}     { do something } 
[\340-\357]{UB}{2}    { do something } 
[\360-\367]{UB}{3}    { do something } 
[\370-\373]{UB}{4}    { do something } 
[\374-\375]{UB}{5}    { do something } 

從郵件列表服用。

我可以看看爲UTF-8支持創建一個適當的補丁後進一步看。上述解決方案對於大型.l文件似乎不可維護。而且真的很醜!您可以使用類似於創建'。'的範圍。替代規則匹配所有ASCII和UTF-8字符,但仍然相當醜陋。

希望這有助於!

1

寫作negatet characterclass也可能有助於:

[\ n \ t]的回報WHITESPACE; [^ \ n \ t] retrun NON_WHITESPACE