Dim*_*ims 7 intellij-idea antlr4
我在MyLexer.g4里面创建了一个文件myproject/src/main/antlr/com/mypackage:
lexer grammar MyLexer;
DIGIT : '0' .. '9' ;
Run Code Online (Sandbox Code Playgroud)
...
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
然后尝试MyParser.g4在同一目录中编写解析器:
grammar MyParser;
options
{ tokenVocab = MyLexer; }
SHORT_YEAR: DIGIT DIGIT;
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我运行gradle任务时generateGrammarSource,会发生以下错误:
error(160): com\mypackage\MyParser.g4:4:18: cannot find tokens file MYPROJECT\build\generated-src\antlr\main\MyLexer.tokens
Run Code Online (Sandbox Code Playgroud)
即在错误的地方寻找文件.
实际文件在里面创建 MYPROJECT\build\generated-src\antlr\main\com\mypackage\MyLexer.tokens
正如 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/")
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令在包中生成解析器时:
@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')
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |