文件中的Antlr标记

文件中的Antlr标记,antlr,Antlr,向Antlr提供大量代币的最佳方式是什么? 假设我们有一个100000个英语动词的列表,我们如何将它们添加到语法中?我们当然可以包含一个巨大的语法文件,比如verbs.g,但也许有一个更优雅的方法,修改一个.token文件等等 grammar verbs; VERBS: 'eat' | 'drink' | 'sit' | ... ... | 'sleep' ; 标记是否应该是lexer或parser标记,即动词:或动词:?可能是动词:。我宁愿使用语义谓词 为此,您必须定义一个令牌 word

向Antlr提供大量代币的最佳方式是什么? 假设我们有一个100000个英语动词的列表,我们如何将它们添加到语法中?我们当然可以包含一个巨大的语法文件,比如verbs.g,但也许有一个更优雅的方法,修改一个.token文件等等

grammar verbs;

VERBS:
'eat' |
'drink' |
'sit' |
...
...
| 'sleep'
;

标记是否应该是lexer或parser标记,即动词:或动词:?可能是动词:。

我宁愿使用语义谓词

为此,您必须定义一个令牌

word : [a-z]+
在每一个你想使用动词(而不是泛型词)的站点上,放一个语义谓词,检查被解析的词是否在动词列表中

使用建议不要将解析器/词法分析器用于此类任务

  • 每增加一个动词都会改变语法
  • 每个附加动词都会放大生成的代码
  • 接合更容易
  • 上/小写字母可能更容易处理

Update:antlr无法使用english_verbs.g文件,尽管没有出现特殊字符:org.antlr.tool.GrammarSanity.traceStatesLookingForLeftRecursion(GrammarSanity.java:149)。。。(重复10^99次)无论你做什么,都可能会测试识别器的极限。不,你不可能创建一个超过许多规则的lexer。要了解解决方法,请参阅:无论如何,我建议您使用lexer