2016-11-16 80 views
2

我一直在尋找兩個小時而現在我並不知道該怎麼做。構建一個包含很多令牌的詞法分析器

我試圖建立一個分析器,使用可以匹配幾千字的詞法分析器。這些都是自然語言的詞語,這就是爲什麼他們如此之多。

我第一次嘗試用簡單的方法只有1000型動物爲一個令牌匹配:

TOKEN : 
{ 
    <VIRG: ","> 
| <COORD: "et"> 
| <ADVERBE: "vraiment"> 
| <DET: "la"> 
| <ADJECTIF: "bonne"> 
| <NOM: "pomme" 
     | "émails" 
     | "émaux" 
     | "APL" 
     | "APLs" 
     | "Acide" 
     | "Acides" 
     | "Inuk" 

[...] 

javac編譯的後返回代碼是太大。

那麼,我怎麼能在我的詞法分析器中管理數千個令牌?

  1. 我讀過,對每個單詞使用n個令牌比對n個單詞使用一個令牌更有效。但在這種情況下,我將擁有1000多個令牌的規則,這看起來不是一個好主意;

  2. 我可以修改令牌管理器,或者構建一個,所以它只是匹配列表中的單詞;

  3. 這裏我知道詞法分析器是一個有限狀態機,這就是爲什麼它是不可能的,所以有反正使用其他詞法分析器嗎? ;

  4. 我可以自動生成一個匹配每個單詞的巨大正則表達式,但這不會讓我在事後獨立處理單詞,而且我不確定寫60行正則表達式是好想法;

  5. 也許有辦法從文件中加載令牌,這個解決方案非常接近解決方案2和3;

  6. 也許我應該使用另一種語言?我試圖從XLE(它可以處理超過70000個令牌的詞庫)遷移到java,這裏有趣的是生成java文件!

所以在這裏,我可以找到我的方式來處理數千個與javacc詞法分析器的令牌。如果有人使用它並有想法,那將會很棒嗎?

最佳

Corentin

+0

如果您使用JavaCC構建解析器,則可能需要使用自定義詞法分析器(請參閱「USER_TOKEN_MANAGER」選項),該詞法分析器使用@rici在下面提到的實現技術。如果你只想要一個詞法分析器,JavaCC可能不是最好的工具。 –

回答

3

我不知道怎麼的JavaCC構建其DFA,但它一定是一個能夠區分數千字的DFA將是相當大的。 (但絕不是不合理的大:我已經靈活地構建了具有數十萬個狀態的DFA,而沒有出現嚴重問題。)

對於具有大量固定詞位的詞典的常用方法是使用DFA來識別一個潛在的單詞(例如,一系列字母字符),然後在字典中查找單詞以獲取令牌類型。這也更加靈活,因爲您可以在不重新編譯的情況下更新字典。

相關問題