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从接触到搭建完毕相关推荐

  1. 只待狂欢!青岛凤凰音乐节三大主题舞台搭建完毕

    9月29日2020青岛凤凰音乐节将于10月2日-3日在青岛西海岸新区金沙滩啤酒城举办,在去年精美绝伦的舞台基础上,再度全面升级的三大主题舞台,现在已经搭建完毕,超强音浪即将燃爆"音乐之岛&q ...

  2. 车小米O2O保养平台搭建完毕

    www.51chexiaomi.com 无忧车小米上线了,开展上海地区的试运营 转载于:https://www.cnblogs.com/SlashOut/p/4735288.html

  3. 需要搭建一个高性能的文件系统?我推荐你试试它.....

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 本文系投稿,作者:Object 前言 今天给大家介绍的是F ...

  4. easyexcel根据模板写入_用 Vue+ElementUI 搭建后台管理极简模板

    本文由图雀社区成员 灿若星空[1] 写作而成,欢迎加入图雀社区,一起创作精彩的免费技术教程,予力编程行业发展. 写在前面 此篇文章为一篇说明文档,不是教你从零构建一个后台管理系统,而是基于一个实际项目 ...

  5. element ui 前台模板_用 Vue+ElementUI 搭建后台管理极简模板

    本文由图雀社区成员https://blog.csdn.net/crxk_​blog.csdn.net 写在前面 此篇文章为一篇说明文档,不是教你从零构建一个后台管理系统,而是基于一个实际项目,已经搭建 ...

  6. (Ⅰ)基于Hexo+GitHub Page搭建博客,绑定域名及备份

    前言 这里引用阮一峰老师网络日志里说的,对于喜欢写博客的人,会经历三个阶段: 第一阶段,刚接触 Blog,觉得很新鲜,试着选择一个免费空间来写. 第二阶段,发现免费空间限制太多,就自己购买域名和空间, ...

  7. ESP8266在Alios-Things上的入门开发指南 (一)开发环境搭建及HelloWorld固件

    一.    开发环境搭建 目前国内大多数开发者使用的都是WinXP/Win7/Windows XX做MCU的开发.习惯Windows环境开发的朋友,如果一旦一接触到MCU需要是Linux环境来进行开发 ...

  8. 【tool】企业级开源分布式文件服务器搭建(FastDFS)

    项目介绍 FastDFS介绍 FastDFS是一个以C语言开发的开源轻量级分布式文件系统,由阿里巴巴开发并开源.它对文件进行管理,功能包括:文件存储.文件同步.文件访问(上传.下载)等.解决了大容量存 ...

  9. Android开发环境搭建与入门Hello World

    一直没机会接触手机开发,很想开发一款手机围棋软件,今天先学习一下环境搭建与Hello World吧. 环境配置对于没入门的很麻烦,谁如果有需要留下QQ邮箱,我发给你.不客气,呵呵. 推荐一本书: Go ...

最新文章

  1. 圈子 | 大数据分析汽车O2O的机会
  2. ON TOP-N and pagination queries
  3. 讨伐 Google!为什么建智能城市要毫无隐私?| 极客头条
  4. Linux/Android之perf追内存泄漏工具(api级别)
  5. PDF Reader Pro - 一款全能型PDF文件编辑器
  6. Docker 入门教程
  7. 我的MacOS上的软件
  8. 【Pandas】Pandas数据分类
  9. 一文带你读懂“TRIZ”
  10. 【文献阅读笔记】KAM Theory Meets Statistical Learning Theory: Hamiltonian Neural Networks with Non-Zero Trai
  11. 利久贝分享:如何摆脱“穷人思维”?
  12. 怎样快速提取视频中的音频文件?
  13. acm2015北京区域赛游记
  14. MPO光纤跳线的结构和极性分类
  15. 数论概论读书笔记 25.哪些数可表成两个平方数之和
  16. 【格式化文档】ISO 27001控制措施+ISO27002实施指南 【下】
  17. java false 0_Java中false指的是1还是0
  18. STM32 RTC时钟掉电日期不更新
  19. 幻霄科技CTO高天寒:创新教育体验—探索AIGC在元宇宙教学实训中的无限潜能|量子位·视点分享回顾...
  20. 微博什么技术啊……还说支持八个明星并发出轨,结果…

热门文章

  1. Fish Redux系列学习之认识effect、reducer
  2. 中国剩余定理(互质与不互质的情况)
  3. Linux(CentOS)安装VMware tools(灰色按钮,无法安装)
  4. “邮件备份”功能详解【申请企业邮箱】
  5. 【MATLAB数据分析】02数据的中位数和分位数
  6. python基础(字符串常用、数字类型转换、基本运算符与流程控制)
  7. 精简瘦身Windows XP的方法
  8. [展览人周刊]华展云20170724期
  9. 数据加密存储常见的加密方式
  10. 去除龙卷风收音机软件界面下广告的方法