antlr4官网:http://www.antlr.org
antlr3官网:http://www.antlr3.org
刚刚成功实现从java程序中调用antlr生成的语法文件。特此记录下。
首先需要一个php的文法文件:
https://code.google.com/p/phpparser
发现这个Php.g不能使用antlr v4编译,下载v3的antlrworks,发现一调试一堆错误,很多类似
[20:04:04] E:\output\PhpParser.java:10655: 错误: 需要<标识符>
[20:04:04] public final void synpred23_Php_fragment() throws {
的错误,不明原因。
那就不要IDE了,直接下载
http://www.antlr3.org/download.html -> Complete ANTLR 3.5 Java binaries jar
里面已经包括了java的runtime。(如果使用其他语言还需要下载那个语言的runtime)
python:(需先下载python的runtime,然后安装他,注意python的版本得根据runtime的版本,antlr_python_runtime-3.1.3这个只能支持python2.4 2.5啊。)
http://www.antlr.org/wiki/display/ANTLR3/Antlr3PythonTarget
支持的python版本太低了,新版antlr4里面runtime又只有java的,那就用java把。
下面是一个简单例子的完整步骤。
1. 下载 antlr-3.5-complete.jar
2. 放在随便一个目录,比如D:/antlr/
3. 添加环境变量classpath。在后面追加 D:\antlr\antlr-3.5-complete.jar;
4. 命令行输入 java org.antlr.Tool ,会打印出参数列表,表示antlr的命令可用了。
5. 新建一个目录,新建一个文件命名为:E.g 内容为:
grammar E; options{ output=AST; } program : statement + ; statement: (expression | VAR '=' expression) ';' ; expression : (multExpr (('+' |'-' ) multExpr)*) | STRING; multExpr : atom ('*' atom)*; atom : INT | '(' expression ')'; VAR : ('a'..'z' |'A'..'Z' )+ ; INT : '0'..'9' + ; STRING : '"' (('A'..'Z' | 'a'..'z' | ' ') +) '"' ; WS : (' ' |'\t' |'\n' |'\r' )+ {skip();} ;
这是一个识别算术式子和字符串的文法,下面用antrl生成词法语法分析的文件。
6. 进入到该文件的目录,命令行输入 java org.antlr.Tool E.g ,这时会生成三个文件 E.tokens ELexer.java EParser.java.
7. 接下来需要对生成的java代码编译运行,首先需要一个主函数,在该目录新建一个文件命名为 run.java。输入内容:
import org.antlr.runtime.*; import org.antlr.runtime.tree.*; public class run { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); ELexer lexer = new ELexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); EParser parser = new EParser(tokens); EParser.program_return r = parser.program(); System.out.println(((BaseTree)r.getTree()).toStringTree()); } }
这里的parser.program()中program()是我们文法的起点,就是第一条规则的名字,如果不是这个则需要修改,同时.program_return中下划线前面的部分跟随一起修改。
8. 编译所有的.java文件。命令行输入: javac *.java ,生成class文件后,执行run。输入 java run。此时需要输入参数,输入
2+4*5;
str="hello";
^Z
^Z是按Ctrl+Z产生的,表示输入结束。回车后发现结果
2 + 4 * 5 ; str = "hello";
表示运行成功了,至于为什么打印这个结果是因为run.java里使用了toStringTree(),更多的API可见
http://www.antlr3.org/api/
9. 学习API,更详细的分析生成的抽象语法树。
10. over.
补充:Ast树的简单遍历操作
//转为CommonTree格式,CommonTree类提供一些操作树的方法供我们使用 CommonTree root = (CommonTree)r.getTree(); //输出树的string格式 System.out.println(root.toStringTree()); //获取节点root的子节点个数 System.out.println(root.getChildCount()); //获取root的第1个(从0开始)孩子 CommonTree se = (CommonTree) root.getChild(1); //获取root的第1个(从0开始)孩子的第2个孩子 CommonTree th = (CommonTree) se.getChild(2); //获取节点 th 的父节点 System.out.println(th.getParent()); //判断节点 root 是不是根节点 System.out.println(root.isNil()); /*这里只写出几个简单的方法供参考,更多的的请参考 http://www.antlr3.org/api/Java/index.html 查看 Class CommonTree 和 Class BaseTree 的部分*/
相关推荐
ANTLR 入门介绍小 demo ANTLR(ANother Tool for Language Recognition,另一个语言识别工具)是一种强大的解析器生成器,用于读取、处理、执行或翻译结构化的文本或二进制文件。ANTLR 广泛应用于 DSL(领域特定...
在“antlr_intro.rar_antlr4_antlr4 c# demo”这个压缩包中,我们预计将找到一个ANTLR4的C#演示项目,帮助用户理解如何在C#环境中使用ANTLR4。 ANTLR4 工作流程主要包括以下几个步骤: 1. **语法定义**:首先,...
这是使用 ANTLR4 中的新 Python 目标的最小解释器实现,用于演示/示例目的。 在语法上,该语言有点类似于汇编语言。 示例可以在“示例”目录中找到。 入门 $ git clone ...
8. **demo**: 可能包含示例或演示项目,用于展示如何在实际应用中使用ANTLR 4 C++运行时库。 通过这个压缩包,开发者可以学习ANTLR的内部机制,了解如何在C++项目中集成和使用ANTLR,以及如何构建和部署ANTLR C++...
ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL解析器、XML处理器以及各种编程语言的...
对 ANTLR 访问者进行单元测试 该项目演示了如何对 ANTLR 访问者进行单元测试。 被测编译器 被测编译器将解析简单的加法(例如2+2 ),输出类似,但使用单词“PLUS”而不是加号运算符(例如2 PLUS 2 )。 文字测试 到...
在这个名为"antlr4_cmake_demo"的项目中,我们看到它是基于CMake构建的,CMake是一个开源的、跨平台的自动化构建系统,用来管理项目的构建过程。CMake并不直接构建软件,而是生成特定平台的构建文件,如Unix的...
9. **demo**:可能包含了一些示例程序或测试用例,用于展示ANTLR4 C++运行时的用法。 10. **runtime**:这是ANTLR4 C++运行时的核心源代码目录,包含了解析器、词法分析器以及其他相关组件的实现。 在Linux环境下...
工作正在进行中 PostgresSQL v10的Antlr4语法。 该项目正在开发中。... 开发是测试驱动的,测试是通过直接从源postgres存储库中抓取sql命令生成的。 有关详细信息,请参见下面的脚本部分。 设定 ...
在本示例"Cmake_Demo"中,特别提到需要CMake版本大于2.6。这意味着这个项目可能利用了CMake 2.6之后引入的一些新功能或改进,例如更强大的宏定义、更好的跨平台支持或者增强的测试工具CTest。 **外连函数库** ...
5. **解析器(Parser)的实现**:学习如何构建和使用解析器,如递归下降解析(Recursive Descent Parsing)或使用YACC、ANTLR等工具生成解析器。 6. **错误处理**:当输入的SQL语句不符合语法规则时,如何有效地...
标题“ssh整合demo”指的是Spring、Struts和Hibernate这三大开源框架的集成示例。SSH是Java Web开发中常用的三个框架,它们分别负责控制层、视图层和持久层的操作。接下来,我们将深入探讨SSH整合的关键知识点以及...
antlr-2.7.2.jar aopalliance-1.0.jar aopalliance.jar apache-commons-codec-1.4.jar asm-3.3.1.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar axis2-java2wsdl-1.0.jar builder-0.6.2.jar c3p0-0.9.1.2....
- 获取Struts2的相关jar包,包括`antlr-2.7.2.jar`、`commons-fileupload-1.2.1.jar`、`freemarker-2.3.15.jar`、`ognl-2.7.3.jar`、`struts2-core-2.1.8.1.jar`、`struts2-portlet-plugin-2.1.8.1.jar`和`xwork-...
【描述】"qcon_demo" 提到的演示,可能是一个具体的项目或代码示例,展示了如何在实际开发中运用解析器组合器。在软件工程中,解析器是处理输入数据(如编程语言源代码、配置文件或特定格式的数据)的关键组件。组合...
在指导手册中,你可能会找到关于如何实现这些步骤的具体指导,包括使用工具如Yacc(语法分析)、Flex(词法分析)或ANTLR(通用解析器生成器)。同时,你也会学习到如何调试编译器,解决错误和异常。 通过这些实验...
“ Gopher掌握规则” Grule导入“ github.com/hyperjumptech/grule-rule-engine” Go的规则引擎是Golang编程语言的规则引擎库。 ...Go的Rule Engine是Golang编程语言的规则引擎库。 受到备受赞誉的JBOSS Drools的启发,...
5. **实践项目**:参与开源项目或自己动手实现一个小规模的编译器,如题目中提到的"demo.cpp"和"demo.h",可以提升实际操作能力。 6. **调试编译器输出**:分析编译器生成的错误信息,理解其背后的逻辑,有助于深入...
- `antlr-2.7.2.jar` - `commons-fileupload-1.2.1.jar` - `freemarker-2.3.15.jar` - `ognl-2.7.3.jar` - `struts2-core-2.1.8.1.jar` - `struts2-portlet-plugin-2.1.8.1.jar` - `xwork-core-2.1.6.jar` 2...
- 开发此类工具,可以使用编译原理中的解析技术,如LR、LL解析,或者使用现成的解析库如ANTLR、JFlex等。 - 编写词法分析器和语法分析器时,需要考虑SQL的变种,因为不同的数据库系统(如MySQL, PostgreSQL, ...