环境配置
这里参考了https://blog.csdn.net/sherrywong1220/article/details/53697737
1.安装IDEA.
2.在File-Settings-Plugins中安装ANTLR v4 grammar plugin插件.
3.新建一个Maven项目,在pom.xml文件中添加ANTLR4插件和运行库的依赖,注意一定要用最新版的。最后在pom.xml中</project>前添加代码:
<dependencies>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4</artifactId>
<version>4.7</version>
<executions>
<execution>
<id>antlr</id>
<goals>
<goal>antlr4</goal>
</goals>
<phase>none</phase>
</execution>
</executions>
<configuration>
<outputDirectory>src/test/java</outputDirectory>
<listener>true</listener>
<treatWarningsAsErrors>true</treatWarningsAsErrors>
</configuration>
</plugin>
</plugins>
</build>
项目流程
- 新建一个g4文件,在里面写入要识别语言的词法规则和语法规则
.
2. 写完后,右键prolog.g4,选择Configure ANTLR,配置output路径。
词法分析器和语法分析器会生成在java文件夹下的com.antlr.out包下,之后如果写的主函数转换程序和生成的这些文件不在同一个文件夹下,就可以通过下面的代码来引用。
import com.antlr.out.prologLexer;
import com.antlr.out.prologParser;
3.右键prolog.g4,选择Generate ANTLR Recognizer生成所有的监听器Java代码。可以看到生成的结果。
4.最后编写主函数和转换函数。最后的项目目录如下:
我的主函数代码如下,待转化的语言放在t.prolog中,通过文件读取输入,调用转换程序来将带转换语言转换成目标语言。
//主函数
import com.antlr.out.prologLexer;
import com.antlr.out.prologParser;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import java.io.File;
import java.io.FileInputStream;
public class Mytranslation {
public static void main(String[] args) throws Exception {
File file = new File("E:\\prolog2NL\\src\\main\\java\\t.prolog");
FileInputStream is = new FileInputStream(file);
ANTLRInputStream input = new ANTLRInputStream(is);
prologLexer lexer = new prologLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
prologParser parser = new prologParser(tokens);
parser.setBuildParseTree(true);
ParseTree tree = parser.p_text();
ParseTreeWalker walker = new ParseTreeWalker();
prolog2NL.prologEmitter converter = new prolog2NL.prologEmitter();
walker.walk(converter, tree);
System.out.println(converter.getprolog(tree));
}
}
文法可视化
- 打开Antlr Preview。
- 在g4中选中一个语法定义符号,如expr。右键选中的符合,选择Text Rule expr。
- 在ANTLR Preview中选择input,输入表达式,则能显示出可视化的文法。
相关链接
这个GitHub项目上有几乎所有语言的g4文件https://github.com/antlr/grammars-v4
antlr4权威指南上的代码在英文版的书上的链接里有,其中有一个例子json转xml,我自己用IDEA跑了一下https://github.com/mantuoluozk/antlr4_json2xml。
所以我仿照antlr4权威指南上的json转xml的监听器方法做了一个prolog语言转自然语言的小例子https://github.com/mantuoluozk/antlr4_prolog2NL