我在MyLexer.g4
内创建了一个文件myproject/src/main/antlr/com/mypackage
,如:
lexer grammar MyLexer;
DIGIT : '0' .. '9' ;
...
WS : [ \t\r\n]+ -> skip ;
然后尝试在同一目录中的MyParser.g4
中编写解析器:
grammar MyParser;
options
{ tokenVocab = MyLexer; }
SHORT_YEAR: DIGIT DIGIT;
不幸的是,当我运行generateGrammarSource
的gradle任务时,会发生以下错误:
error(160): com\mypackage\MyParser.g4:4:18: cannot find tokens file MYPROJECT\build\generated-src\antlr\main\MyLexer.tokens
即。在不正确的地方寻找文件。
在MYPROJECT\build\generated-src\antlr\main\com\mypackage\MyLexer.tokens
答案 0 :(得分:3)
使用以下方法在包中生成解析器时
@header {package org.acme.my.package;}
并在解析器中声明 tokenVocab
options {tokenVocab = MyLanguage;}
由于存在各种错误,MyLanguageLexer.g4和MyLanguageParser.g4文件不得出现在软件包目录中。。
所以这意味着/src/main/antlr/MyLanguageParser.g4
而不是/src/main/antlr/com/acme/my/package/MyLanguageParser.g4
。
java文件最终位于build / generated-src / antlr中的错误目录中,但不知何故使它成为build / classes / java / main中的正确目录。并且.tokens文件最终会在antlr期望的地方结束。
请记住,这会让您的IDE感到困惑;我必须将已编译的类添加回我的compileClasspath以避免视觉类未找到问题。
dependencies {
testCompile fileTree('build/classes/java/main')
}
答案 1 :(得分:1)
正如Steven Spungin所说,您需要将ANTLR源文件放在目录src/main/antlr/
中,而不是放在该目录的子目录中。
您无需将@header
添加到ANTLR源文件中。请改用以下内容。
在你应该拥有的build.gradle
中(根据你的ANTLR版本进行了修改):
apply plugin: 'antlr'
dependencies {
antlr "org.antlr:antlr4:4.7.1"
}
generateGrammarSource {
arguments += ['-package', 'com.mypackage']
outputDirectory = new File(buildDir.toString() + "/generated-src/antlr/main/com/mypackage/")
}