antlr java_ANTLR从接触到搭建完毕
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把。
下面是一个简单例子的完整步骤。
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 classrun {public static void main(String[] args) throwsException {
ANTLRInputStream input= newANTLRInputStream(System.in);
ELexer lexer= newELexer(input);
CommonTokenStream tokens= newCommonTokenStream(lexer);
EParser parser= newEParser(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 java_ANTLR从接触到搭建完毕相关推荐
- 只待狂欢!青岛凤凰音乐节三大主题舞台搭建完毕
9月29日2020青岛凤凰音乐节将于10月2日-3日在青岛西海岸新区金沙滩啤酒城举办,在去年精美绝伦的舞台基础上,再度全面升级的三大主题舞台,现在已经搭建完毕,超强音浪即将燃爆"音乐之岛&q ...
- 车小米O2O保养平台搭建完毕
www.51chexiaomi.com 无忧车小米上线了,开展上海地区的试运营 转载于:https://www.cnblogs.com/SlashOut/p/4735288.html
- 需要搭建一个高性能的文件系统?我推荐你试试它.....
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 本文系投稿,作者:Object 前言 今天给大家介绍的是F ...
- easyexcel根据模板写入_用 Vue+ElementUI 搭建后台管理极简模板
本文由图雀社区成员 灿若星空[1] 写作而成,欢迎加入图雀社区,一起创作精彩的免费技术教程,予力编程行业发展. 写在前面 此篇文章为一篇说明文档,不是教你从零构建一个后台管理系统,而是基于一个实际项目 ...
- element ui 前台模板_用 Vue+ElementUI 搭建后台管理极简模板
本文由图雀社区成员https://blog.csdn.net/crxk_blog.csdn.net 写在前面 此篇文章为一篇说明文档,不是教你从零构建一个后台管理系统,而是基于一个实际项目,已经搭建 ...
- (Ⅰ)基于Hexo+GitHub Page搭建博客,绑定域名及备份
前言 这里引用阮一峰老师网络日志里说的,对于喜欢写博客的人,会经历三个阶段: 第一阶段,刚接触 Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间, ...
- ESP8266在Alios-Things上的入门开发指南 (一)开发环境搭建及HelloWorld固件
一. 开发环境搭建 目前国内大多数开发者使用的都是WinXP/Win7/Windows XX做MCU的开发.习惯Windows环境开发的朋友,如果一旦一接触到MCU需要是Linux环境来进行开发 ...
- 【tool】企业级开源分布式文件服务器搭建(FastDFS)
项目介绍 FastDFS介绍 FastDFS是一个以C语言开发的开源轻量级分布式文件系统,由阿里巴巴开发并开源.它对文件进行管理,功能包括:文件存储.文件同步.文件访问(上传.下载)等.解决了大容量存 ...
- Android开发环境搭建与入门Hello World
一直没机会接触手机开发,很想开发一款手机围棋软件,今天先学习一下环境搭建与Hello World吧. 环境配置对于没入门的很麻烦,谁如果有需要留下QQ邮箱,我发给你.不客气,呵呵. 推荐一本书: Go ...
最新文章
- 圈子 | 大数据分析汽车O2O的机会
- ON TOP-N and pagination queries
- 讨伐 Google!为什么建智能城市要毫无隐私?| 极客头条
- Linux/Android之perf追内存泄漏工具(api级别)
- PDF Reader Pro - 一款全能型PDF文件编辑器
- Docker 入门教程
- 我的MacOS上的软件
- 【Pandas】Pandas数据分类
- 一文带你读懂“TRIZ”
- 【文献阅读笔记】KAM Theory Meets Statistical Learning Theory: Hamiltonian Neural Networks with Non-Zero Trai
- 利久贝分享:如何摆脱“穷人思维”?
- 怎样快速提取视频中的音频文件?
- acm2015北京区域赛游记
- MPO光纤跳线的结构和极性分类
- 数论概论读书笔记 25.哪些数可表成两个平方数之和
- 【格式化文档】ISO 27001控制措施+ISO27002实施指南 【下】
- java false 0_Java中false指的是1还是0
- STM32 RTC时钟掉电日期不更新
- 幻霄科技CTO高天寒:创新教育体验—探索AIGC在元宇宙教学实训中的无限潜能|量子位·视点分享回顾...
- 微博什么技术啊……还说支持八个明星并发出轨,结果…