ANTLR(语言识别的另一工具)的简介之二[翻译]

翻译 2004年02月11日 14:08:00

亲和的ANTLR语法的介绍  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

通过例子来逐渐学习ANTLR是最好的。 一个简单计算器常被用来入门,原因很简单:它简单易懂。这有许多给ANTLR的相似例子和教程,但是我会使用我自己的语言来描述一个计算器。首先我们会创建一些可以直接对简单表达式求值的程序。然后,我会生成树结构,并计算这些树来得到同样的答案。

当你知道最终你需要将一个字符输入流分解成多个记号时,则好的开始就是去思考一个表达式的文法结构。

语法向导执行

语言识别

我们接受了包含+,-和*的算术表达式,如3+4*5-1,或是可以增强求值顺序的括号表达式,如(3+4)*5。

全部ANTLR语法都是lexer,语法解析程序和语法树解析程序的子类。既然你应该开始在文法层面思考问题,你因该创建一个文法解析程序的子类。在类的声明之后,你可以使用扩展巴柯斯范式符号指定规则:

class ExprParser extends Parser;

 

expr:   mexpr ((PLUS|MINUS) mexpr)*

    ;     

 

mexpr     

    :   atom (STAR atom)*

    ;   

 

atom:   INT

    |   LPAREN expr RPAREN

    ;

lexer遵从相似的模式,它只需要定义一些操作符和空白符。把lexer放进相同的文件,如expr.g,是要做的最容易的事情:

class ExprLexer extends Lexer;

 

options {

    k=2; // needed for newline junk

    charVocabulary='/u0000'..'/u007F'; // allow ascii

}

 

LPAREN: '(' ;

RPAREN: ')' ;

PLUS  : '+' ;

MINUS : '-' ;

STAR  : '*' ;

INT   : ('0'..'9')+ ;

WS    : ( ' '

        | '/r' '/n'

        | '/n'

        | '/t'

       )

        {$setType(Token.SKIP);}

      ;   

从这个语法定义文件expr.g生成程序(Java),可以运行ANTLR如下:

$ java antlr.Tool expr.g

ANTLR Parser Generator   Version 2.7.2   1989-2003 jGuru.com

$

ANTLR 产生什么?

当发现没有必要完成这个教程时,你可能看到ANTLR在识别程序文件里面生成了什么,并发现这很有启发。ANTLR生成了识别程序,这些程序模拟你通过手工递归下推的语法分析程序来创建的东西;而另一方面,yacc及其朋友在模拟下推自动机的时候生成满是整形数的表。

ANTLR 将产生下列文件:

ExprLexer.java

ExprParser.java

ExprParserTokenTypes.java

ExprParserTokenTypes.txt

如果你看一下里面的内容,比如ExprParser.java,你会看到它为文件expr.g中有解析语法定义的每条规则生成一个方法。比如,mexpr合atom规则的代码看起来类似如下代码:

public void mexpr() {

  atom();

  while ( LA(1)==STAR ) {

    match(STAR);

    atom();

  }

}

 

public void atom() {

  switch ( LA(1) ) { // switch on lookahead token type

    case INT :

      match(INT);

      break;

    case LPAREN :

      match(LPAREN);

      expr();

      match(RPAREN);

      break;

    default :

      // error

  }

}

注意到规则定义被翻译成了方法调用,而记号定义则被译成match(TOKEN)函数调用。则关于创建一种语法parser中仅有的难事就是计算前瞻信息。

记号类别类定义了你的词法分析程序(lexer)和parser所使用到的所有记号类别数字常量:

// $ANTLR 2.7.2: "expr.g" -> "ExprParser.java"$

 

public interface ExprParserTokenTypes {

        int EOF = 1;

        int NULL_TREE_LOOKAHEAD = 3;

        int PLUS = 4;

        int MINUS = 5;

        int STAR = 6;

        int INT = 7;

        int LPAREN = 8;

        int RPAREN = 9;

        int WS = 10;

}

测试lexer/parser

为了在实际中使用在ExprParser.java中作为结果的parser,须像如下所示来使用main()函数:

import antlr.*;

public class <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main {

    public static void main(String[] args) throws Exception {

        ExprLexer lexer = new ExprLexer(System.in);

        ExprParser parser = new ExprParser(lexer);

        parser.expr();

    }

}

$ java Main

3+(4*5)

$

给错误的输入:

$ java Main

3++

line 1:3: unexpected token: +

$

或者

$ java Main

3+(4

line 1:6: expecting RPAREN, found 'null'

$

用ANTLR实现规则解析

ANTLR(pronounced Antler) 是一个语言识别工具,Another Tool forLanguage Recognition 的缩写。ANTLR由旧金山大学(University ...
  • u012856866
  • u012856866
  • 2014年03月19日 09:38
  • 1882

hive sql语句转换成mapreduce

1.hive是什么? 2.MapReduce框架实现SQL基本操作的原理是什么? 3.Hive怎样实现SQL的词法和语法解析? 连接:http://www.aboutyun.com/thread-20...
  • u010738184
  • u010738184
  • 2017年04月28日 11:33
  • 1775

Hive SQL的编译过程_美团技术点评

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和...
  • awewong
  • awewong
  • 2016年11月16日 20:13
  • 470

ANTLR(语言识别的另一工具)的简介之三[翻译]

表达式求值实际中需要当记号进来时直接对表达式求值,这可以在parser中添加行为:class ExprParser extends Parser; expr returns [int value=0]...
  • leafinwind
  • leafinwind
  • 2004年02月11日 14:08
  • 1026

ANTLR(语言识别的另一工具)的简介之四[翻译]

通过抽象语法树(AST)求值现在你已经看到了基本的语法指导的翻译/计算,在此文法/语法指示了什么时候去执行动作。一个更为强大的策略是创建一个中介表达,它拥有所有或绝大部分的输入符号,并在数据的结构中,...
  • leafinwind
  • leafinwind
  • 2004年02月11日 14:08
  • 856

Antlr4学习笔记

参考博客《The Definitive ANTLR 4 Reference, 2nd Edition》
  • hjw199089
  • hjw199089
  • 2017年11月14日 22:50
  • 118

HiveSQL解析过程详解

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和...
  • bbbeoy
  • bbbeoy
  • 2017年03月17日 17:11
  • 946

ANTLR(语言识别的另一工具)的简介之一[翻译]

ANTLR简介 特伦斯·帕尔 简介 在20世纪80年代,我手工创建许多许多的语言识别程序和翻译程序,最后这变得十分厌烦,以至于开始尝试使这个过程自动化; 由此产生了我的格言:  "你能够用生命中五年的...
  • leafinwind
  • leafinwind
  • 2004年02月11日 14:08
  • 1283

Antlr 简介

ANTLR 语言识别的一个工具 (ANother Tool for Language Recognition ) 是一种语言工具,它提供了一个框架,可以通过包含 Java, C++, 或 C# 动作(...
  • u013407592
  • u013407592
  • 2015年12月11日 11:12
  • 1007

HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和...
  • youzhouliu
  • youzhouliu
  • 2017年04月26日 16:37
  • 1081
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ANTLR(语言识别的另一工具)的简介之二[翻译]
举报原因:
原因补充:

(最多只允许输入30个字)