`

antlr antlr简介

阅读更多

ANTLR(ANother Tool for Language Recognition)风头正盛,经常可以看到用它做语法解释器的项目,比如Hibernate就在3.0的时候换上它来解释HQL,使HQL的语法获得了加强。因为Antlr是EBNF-AST语法解释系的代表,而自己总是心思思想搞一下DSL(领域语言),所以从Hibernate来学习一下Antlr的应用。
Antlr最好的介绍文章是那篇A Gentle Introduction to ANTLR Syntax,在《程序员》2004年3月有中文的版本。不过,那个计算器的例子太简单了,了解完基本原理后,还是要看看Hibernate的实战。 另外,SlickEdit 支持Antrl的语法,是一定要用的编辑器,在 ttdown.com上有破解。

  一,Antlr引擎的工作过程大概是这样的:  1.定义Lexer类,在类中定义各种Token如 From , Where,=,<>....... Lexer负责把读入的普通文本识别成Token串。

  2.定义Parser类,在类中使用BNF语法,递归定义各种句子,如whereStatement、FromStatement、Select Statement。   Pattern负责把读入的Token串匹配成句子,翻译出AST(抽象语法树)  有些简单的应用,也可以在本层现炒现卖,完成所有动作,属于Single Pass Builder。

  3.定义TreeParser类,根据Parser类分析出来的AST(抽象语法树)进行动作。用Parser把AST抽取出来,再用TreeParser进行动作的Double Pass Builder模式,解耦了Parser和Generation,再配合Template,是Antlr推荐的最佳模式。

  二,开发人员的实际步骤

  1.按照Antlr的简单语法定义前面讲的3个类,文件的后缀名为g  2.使用java antlr.Tool xxx.g 命令 ,把grammar文件编译成java文件  3.编写应用程序,如:import antlr.*;import antlr.collections.*;public class Main { public static void main(String[] args) throws Exception { ExprLexer lexer = new ExprLexer(System.in); ExprParser parser = new ExprParser(lexer); parser.expr(); AST ast = parser.getAST(); ExprTreeParser treeParser = new ExprTreeParser(); int x = treeParser.expr(ast); } }

三,Hibernate对Antlr的应用看Antlr对HQL的解释,觉得EBNF系的方法要解释Java这样的编程语言还好些,如果要解释类自然语言的DSL就比较痛苦,所以情绪不是很高涨,挑一条最容易的"Delete from goods where ....." 匆匆走过场。 Joel的一句话对我的影响比较大:"如果为了证明一个微不足道的问题需要花三个小时写下几黑板的证明步骤,那么这种机制不可能用来证明任何有趣的东西" 。对于我这个层次的程序员,antlr在我手中造不出有趣的DSL来。

Hibernate的HQL Grammar文件一共有三个,在/grammar目录下: 1.hql.g 定义Token类和Parser类,将HQL解释成hql的抽象语法树(AST) 2.hql-sql.g 定义Tree Walker ,将HQL AST转化为SQL AST,将生成模块与Hibernate解耦。 3.sql-gen.g 定义Tree Walker,从SQL AST生成sql

下面看 DELETE FROM GOODS的翻译过程

1.HqlBaseLexer extends Lexer 定义EQ: '='; LT: '<'; GT: '>';PLUS: '+';等符号及IDENT: ( 'a' .. 'z' | '_' ) ( 'a' .. 'z' | '0' .. '9' | '_' | '$' )*

2.HqlBaseParser extends Parser 先定义DELETE="delete"; FROM="from"; MIN="min"; 等字符串 再定义: statement : ( updateStatement | deleteStatement | selectStatement ) ; 三种Statement之一 deleteStatement : DELETE^ (optionalFromTokenFromClause) (whereClause)? ;DELETE为叶子,(whereClause)可选 optionalFromTokenFromClause! : (FROM!)? f:path { AST #range = #([RANGE, "RANGE"], #f); #optionalFromTokenFromClause = #([FROM, "FROM"], #range); } ;不是很好懂对吧,我也这样觉得,whereClause就更加不要看了。

3. HqlSqlBaseWalker extends TreeParser hql与sql的delete语句基本上是一样的,没什么转换。 4.SqlGeneratorBase extends TreeParser 根据SQL AST, 生成SQL语句 private StringBuffer buf = new StringBuffer(); protected void out(String s) { buf.append(s); } statement : selectStatement | updateStatement | deleteStatement ; deleteStatement : #(DELETE { out("delete"); } from (whereClause)? ) ;输出"delete" from : #(f:FROM { out(" from "); } (fromTable)* ) ; fromTable : #( a:FROM_FRAGMENT { out(a); } (tableJoin [ a ])* { fromFragmentSeparator(a); } ) | #( b:JOIN_FRAGMENT { out(b); } (tableJoin [ b ])* { fromFragmentSeparator(b); } ) ; tableJoin [ AST parent ] : #( c:JOIN_FRAGMENT { out(" "); out(c); } (tableJoin [ c ] )* ) | #( d:FROM_FRAGMENT { nestedFromFragment(d,parent); } (tableJoin [ d ] )* ) ; ................晕了吧 ~~~~~ whereClause : #(WHERE { out(" where "); } ( conditionList | booleanExpr[ false ] ) ) ;

分享到:
评论
1 楼 qinglangee 2009-12-04  
官方不是有自己的编辑器么,干嘛还要用破解的

相关推荐

    Antlr简介以及开发环境

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析工具,主要用于构建语言识别器、编译器和转换器。它源于PCCTS项目,允许开发者通过定义自己的语言规则来生成相应的解析器,从而简化了语言处理的...

    antlr简介及中文手册

    ### ANTLR简介 ANTLR(ANother Tool for Language Recognition)是一个强大的开源工具,主要用于构建解析器、词法分析器和编译器等语言处理组件。它最初由Terence Parr教授开发,其前身是PCCTS(Parr’s Compiler ...

    Antlr简介及中文手册

    ANTLR,全称ANother Tool for Language Recognition,是一个强大的解析工具,源自PCCTS(Parser Construction Toolkit for C++)。ANTLR主要用于帮助开发者构建识别器、编译器和转换器,它基于用户自定义的语言规则...

    antlr-2.7.7.jar.zip

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...

    antlr-2.7.7.jar

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...

    antlr-2.7.7.jar和antlr-2.7.6.jar

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于各种编程语言的编译器和解释器的构建,它能生成Java、C#、Python...

    The Definitive ANTLR 4 Reference.pdf_antlr_

    从标题“Definitive ANTLR 4 Reference”和描述“ANTLR 4的权威参考”可以看出,这本书详细介绍了ANTLR 4的所有核心功能和特性,是学习和使用ANTLR 4的重要资源。 ANTLR 4的主要特点包括: 1. **高级语法定义**:...

    ANTLR

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,包括SQL解析器、XML处理器以及各类编程语言的...

    开源项目-antlr-antlr4.zip

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR被广泛应用于构建语言、工具和框架,如SQL处理器、Java源码分析器、XML解析器...

    java Antlr 4 语法文件合集

    Java Antlr 4 是一个强大的解析工具,用于生成解析器和词法分析器,它使得开发者可以轻松地处理各种语言的语法。Antlr 4 支持多种编程语言,包括 Java,C#,Python,JavaScript 等,而在这个“java Antlr 4 语法文件...

    The Definitive ANTLR 4 Reference.pdf

    ANTLR 4是一款强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架,从脚本语言和配置文件到DSL(领域特定语言)和嵌入式语法。ANTLR 4生成的解析器基于LL(*)...

    Antlr3.Runtime_C#_

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。它广泛应用于构建语言、工具和框架。ANTLR可以生成Java、C#、Python、JavaScript等...

    antlr4-runtime-4.2-API文档-中文版.zip

    赠送jar包:antlr4-runtime-4.2.jar; 赠送原API文档:antlr4-runtime-4.2-javadoc.jar; 赠送源代码:antlr4-runtime-4.2-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.2.pom; 包含翻译后的API文档:...

    antlr中文文档预览版

    - ANTLR简介:对ANTLR的基本介绍,包括其历史、设计目标和主要特点。 - 安装与设置:指导如何在不同操作系统和开发环境中安装ANTLR及相关工具。 - 语法文件(.g4)详解:详细介绍如何编写ANTLR的语法文件,包括词法...

    antlr-2.7.7源码

    antlr 2.7.7源码,下载自:http://repo.spring.io/plugins-release/org/antlr/com.springsource.antlr/2.7.7/

    Antlr入门介绍小demo

    ANTLR 入门介绍小 demo ANTLR(ANother Tool for Language Recognition,另一个语言识别工具)是一种强大的解析器生成器,用于读取、处理、执行或翻译结构化的文本或二进制文件。ANTLR 广泛应用于 DSL(领域特定...

Global site tag (gtag.js) - Google Analytics