環境配置
這裏參考了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