【发布时间】:2016-11-16 16:05:48
【问题描述】:
我已经找了两个小时了,我真的不知道该怎么办。
我正在尝试构建一个分析器,它使用可以匹配数千个单词的词法分析器。这些是自然语言单词,这就是它们如此之多的原因。
我首先尝试了一种简单的方法,一个令牌只有 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 词法分析器处理数千个标记的方法。如果有人对此有所了解并有想法,那就太好了?
最好的
科伦丁
【问题讨论】:
-
如果您使用 JavaCC 构建解析器,您可能希望使用自定义词法分析器(请参阅选项
USER_TOKEN_MANAGER),该词法分析器使用以下 @rici 提到的实现技术。如果你只想要一个词法分析器,JavaCC 可能不是最好的工具。
标签: parsing nlp lexer javacc lexicon