Antlr中文文档初稿2(《ANTLR树分析器》)
本章翻译人 CowNew开源团队 周晓
曾经的SORCERER
什么是树分析器?
可以分析什么类型的树?
- getFirstChild: 返回第一个子结点的引用.
- getNextSibling: 返回下一个兄弟结点的引用.
/** 最小AST结点接口用于ANTLR的AST成生
* 和树遍历
*/
public interface AST {
/** 添加一个子结点到最右边 */
public void addChild(AST c);
public boolean equals(AST t);
public boolean equalsList(AST t);
public boolean equalsListPartial(AST t);
public boolean equalsTree(AST t);
public boolean equalsTreePartial(AST t);
public ASTEnumeration findAll(AST tree);
public ASTEnumeration findAllPartial(AST subtree);
/** 得到第一个子结点; 如果没有子结点则返回null */
public AST getFirstChild();
/** 得到本结点的下一个兄弟结点 */
public AST getNextSibling();
/** 得到本结点的记号文本 */
public String getText();
/** 得到本结点的记号类型 */
public int getType();
/** 得到本结点的子结点总数; 如果是叶子结点, 返回0 */
public int getNumberOfChildren();
public void initialize(int t, String txt);
public void initialize(AST t);
public void initialize(Token t);
/** 设置第一个子结点. */
public void setFirstChild(AST c);
/** 设置下一个兄弟结点. */
public void setNextSibling(AST n);
/** 设置本结点的记号文本 */
public void setText(String text);
/** 设置本结点的记号类型 */
public void setType(int ttype);
public String toString();
public String toStringList();
public String toStringTree();
}
树的语法规则
规则: 可选产生式1
| 可选产生式2
...
| 可选产生式n
;
#( 根结点 子结点1 子结点2 ... 子结点n )
#( PLUS INT INT )
#( IF expr stat (stat)? )
句法断言
expr: ( #(MINUS expr expr) )=> #( MINUS expr expr )
| #( MINUS expr )
...
;
语义断言
一个树遍历器的例子
class CalcParser extends Parser;
options {
buildAST = true; // // 默认使用 CommonAST
}
expr: mexpr (PLUS^ mexpr)* SEMI!
;
mexpr
: atom (STAR^ atom)*
;
atom: INT
;
class CalcLexer extends Lexer;
WS : (' '
| '\t'
| '\n'
| '\r')
{ _ttype = Token.SKIP; }
;
LPAREN: '('
;
RPAREN: ')'
;
STAR: '*'
;
PLUS: '+'
;
SEMI: ';'
;
INT : ('0'..'9')+
;
class CalcTreeWalker extends TreeParser;
expr : #(PLUS expr expr)
| #(STAR expr expr)
| INT
;
class CalcTreeWalker extends TreeParser;
expr returns [int r]
{
int a,b;
r=0;
}
: #(PLUS a=expr b=expr) {r = a+b;}
| #(STAR a=expr b=expr) {r = a*b;}
| i:INT {r = Integer.parseInt(i.getText());}
;
import java.io.*;
import antlr.CommonAST;
import antlr.collections.AST;
class Calc {
public static void main(String[] args) {
try {
CalcLexer lexer =
new CalcLexer(new DataInputStream(System.in));
CalcParser parser = new CalcParser(lexer);
// 分析输入的表达式
parser.expr();
CommonAST t = (CommonAST)parser.getAST();
// 以LISP符号的形式输出树
System.out.println(t.toStringList());
CalcTreeWalker walker = new CalcTreeWalker();
// 遍历由分析器建立的树
int r = walker.expr(t);
System.out.println("value is "+r);
} catch(Exception e) {
System.err.println("exception: "+e);
}
}
}
翻译
一个树翻译的例子
class CalcTreeWalker extends TreeParser;
options{
buildAST = true; // "翻译"模式
}
expr:! #(PLUS left:expr right:expr)
// '!'关闭自动翻译
{
// x+0 = x
if ( #right.getType()==INT &&
Integer.parseInt(#right.getText())==0 )
{
#expr = #left;
}
// 0+x = x
else if ( #left.getType()==INT &&
Integer.parseInt(#left.getText())==0 )
{
#expr = #right;
}
// x+y
else {
#expr = #(PLUS, left, right);
}
}
| #(STAR expr expr) // 使用自动翻译
| i:INT
;
import java.io.*;
import antlr.CommonAST;
import antlr.collections.AST;
class Calc {
public static void main(String[] args) {
try {
CalcLexer lexer =
new CalcLexer(new DataInputStream(System.in));
CalcParser parser = new CalcParser(lexer);
// 分析输入的表达式
parser.expr();
CommonAST t = (CommonAST)parser.getAST();
// 以LISP符号的形式输出树
System.out.println(t.toLispString());
CalcTreeWalker walker = new CalcTreeWalker();
// 遍历由分析器建立的树
walker.expr(t);
// 遍历,并得到结果
t = (CommonAST)walker.getAST();
System.out.println(t.toLispString());
} catch(Exception e) {
System.err.println("exception: "+e);
}
}
}
}
检查/调试AST
public static void main(String args[]) { // 创建树结点 ASTFactory factory = new ASTFactory(); CommonAST r = (CommonAST)factory.create(0, "ROOT"); r.addChild((CommonAST)factory.create(0, "C1")); r.addChild((CommonAST)factory.create(0, "C2")); r.addChild((CommonAST)factory.create(0, "C3")); ASTFrame frame = new ASTFrame("AST JTree Example", r); frame.setVisible(true); }
1
分享
收藏
293篇文章,51W+人气,0粉丝
转载于:https://blog.51cto.com/cownew/86701
Antlr中文文档初稿2(《ANTLR树分析器》)相关推荐
- 使用编译器——Solidity中文文档(8)
写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第八部分<使用编译器>,特发布出来邀请solidity爱好者.开发者做公开 ...
- Hyperopt官方中文文档导读
在2017年的圣诞节前,我翻译了有关HyperOpt的中文文档,这也时填补了空白,以此作为献给所有中国程序员,以及所有其他机器学习相关行业人员的圣诞礼物.圣诞快乐,各位. 更新 Hyperopt官方文 ...
- Hyperopt中文文档导读
在2017年的圣诞节前,我翻译了有关HyperOpt的中文文档,这也时填补了空白,以此作为献给所有中国程序员,以及所有其他机器学习相关行业人员的圣诞礼物.圣诞快乐,各位. HyperOpt中文文档导读 ...
- semantic ui中文文档_Vuetify-广受欢迎的Material风格的开源UI框架
全世界范围内广受欢迎的 Vue UI 框架,一个非常精致的 Material Design UI 套件. Material Design 风格 UI 框架 Vuetify 是一个基于 Vue.js 精 ...
- Chrome 开发者工具官方中文文档
传送门 Chrome开发者工具官方中文文档 Chrome开发者工具详解 前端学习front-end-study系列 Elements面板(https://zhuanlan.zhihu.com/p/24 ...
- React-Redux 中文文档
介绍 快速开始 React-Redux是Redux的官方React绑定库.它能够使你的React组件从Redux store中读取数据,并且向store分发actions以更新数据 安装 在你的Rea ...
- React-bootstrap 中文文档
翻译了 React-bootstrap 中文文档,参考 react.tgwoo.com. React-Bootstrap 是可重用的前端组件库.与 Twitter Bootstrap 一致外观与感受, ...
- Beetl2.7.13 中文文档
## Beetl2.7.13 中文文档 ### 1. 什么是Beetl Beetl目前版本是2.7.13,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使 ...
- BeautifulSoup4 模块中文文档
原文出处 -> Beautiful Soup Documentation 目录 一.前言 1.1 寻求帮助 二.快速开始 三.安装 BeautifulSoup 3.1 安装完成后的问题 3.2 ...
最新文章
- mockito_使用Mockito模拟自动装配的字段
- stcisp一直检测单片机_三种方法对比:STC51单片机实现免冷启动
- PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
- Java学习 第三章 数组(三)排序算法
- 软件测试(一)-黑盒测试 随机测试技巧
- 学web前端有什么计划?
- 从业余挖洞到微软漏洞研究员,我的遗憾、惊喜和建议
- win11系统安装打印机的方法
- MacFree ePlicy Orchestrator
- 19 个接私活平台汇总升级版,你有技术就有钱
- Gradle化的Android Gallery3D App
- iOSButton文字和图片摆放的个字方式
- SCA声明办理 TSCA限用物质检测 TSCA有毒物质控制法案检测
- Google advertiser api开发概述——批量处理
- Hadoop之HDFS01【介绍】,字节跳动解决方案架构师
- 文艺范儿的程序猿和攻城狮们
- 段永平-雪球专刊·段永平投资问答录(上册 商业逻辑篇)(二)
- 龙珠 超宇宙 [Dragon Ball Xenoverse]
- java开发crm框架_这可能是2020年度最完整、详细的Java高级框架+CRM课程哟,小白看完直呼过瘾!...
- 设计模式六大原则(1):单一职责原则
热门文章
- hive 取消打印日志信息_Hive及其相关大数据组件
- php get 分页,PHP_codeigniter实现get分页的方法,本文实例讲述了codeigniter实现ge - phpStudy...
- java搭建线程池框架_JAVA线程池经管及分布式HADOOP调剂框架搭建
- mysql 版本太高_mysql创建新库以及解决版本过高8.0以上导致navicat无法连接的问题...
- matlab模拟砂轮形貌,基于多颗磨粒随机分布的虚拟砂轮建模及磨削力预测
- java中userservice是什么,【图片】求助大神~~我在Reaml中注入userService对象启动tomcat就报错【java吧】_百度贴吧...
- php arrayaccess 二维,PHP数组式访问接口ArrayAccess用法分析
- .wav格式的声音文件怎么变成matlab 中的.mat文件
- centos7 下修改网络配置
- RVC使用指南(三)-对象管理