我一直在寻找两个小时而且我真的不知道该怎么做。
我正在尝试构建一个使用可以匹配几千个单词的词法分析器的分析器。这些都是自然语言,这就是为什么它们如此之多。
我首先以一种简单的方式尝试了一个令牌只有1000个不同的匹配:
TOKEN :
{
<VIRG: ",">
| <COORD: "et">
| <ADVERBE: "vraiment">
| <DET: "la">
| <ADJECTIF: "bonne">
| <NOM: "pomme"
| "émails"
| "émaux"
| "APL"
| "APLs"
| "Acide"
| "Acides"
| "Inuk"
[...]
在javac编译之后,它返回代码太大。
那么,我怎么能在我的词法分析器中管理数千个令牌?
我读过,对每个单词使用n个令牌比对n个单词使用一个令牌更有效。但在这种情况下,我将拥有1000多个令牌的规则,这看起来不是一个好主意;
我可以修改令牌管理器,或者构建一个令牌管理器,因此它只匹配列表中的单词;
在这里我知道词法分析器是一个有限状态机,这就是为什么它不可能,所以无论如何使用其他词法分析器?
我可以自动生成一个匹配每个单词的巨大的正则表达式,但这不会让我之后独立处理单词,而且我不确定写一个60行正则表达式会是一个好主意;
也许有办法从文件加载令牌,这个解决方案非常接近解决方案2和3;
也许我应该使用其他语言?我正在尝试从XLE(可以处理超过70,000个令牌的词典)迁移到java,这里有趣的是生成java文件!
所以在这里,我可以找到使用javacc lexer处理数千个令牌的方法。如果有人使用它并有想法,这将是很好的吗?
最佳
Corentin
答案 0 :(得分:3)
我不知道javacc如何构建其DFA,但可以肯定的是,能够区分数千个单词的DFA会非常大。 (但绝不是不合理的大:我已经灵活地建立了成千上万个州没有重大问题的DFA。)
具有大量固定词位的词典的常用方法是使用DFA识别潜在词(例如,一系列字母字符),然后在字典中查找单词以获得令牌类型。这也更灵活,因为你可以在不重新编译的情况下更新字典。