Antlr的一个例子分析

[ 2007-02-13 22:47:23 | 作者: progame ]
文字大小: | |
用的是 Antlr 2.77 中自带的那个 calc 的例子,用来算加法和乘法的
如输入: 1+ 2* 3;


options {
  language = "CSharp";
}

class CalcParser extends Parser;
options {
  buildAST = true;  // uses CommonAST by default
}

expr
  :  mexpr (PLUS^ mexpr)* SEMI!
  ;
  // ^表示AST的parent节点 此处表示PLUS为根节点
  // !表示AST中不包括此节点,此处表示TreeParser无须SEME(;)
  // *表示0个或多个,不用多讲

mexpr
  :  atom (STAR^ atom)*
  ;

atom:  INT
  ;

class CalcLexer extends Lexer;

WS  :  (' '
  |  '\t'
  |  '\n'
  |  '\r')
    { _ttype = Token.SKIP; }
  ;

  // _ttype = Token.SKIP 表示碰到此token一律无视之
  // 写成$setType(Token.SKIP)效果也一样
LPAREN:  '('
  ;

RPAREN:  ')'
  ;

STAR:  '*'
  ;

PLUS:  '+'
  ;

SEMI:  ';'
  ;

protected  // 表示只是在Lexer中调用,Parser里不会用它
DIGIT
  :  '0'..'9'
  ;

INT  :  (DIGIT)+
  ;

class CalcTreeWalker extends TreeParser;

expr returns [float r]
{
  // 添加一些初始化代码
  float a,b;
  r=0;
}
  :  #(PLUS a=expr b=expr)  {r = a+b;}
  |  #(STAR a=expr b=expr)  {r = a*b;}
  |  i:INT      {r = Convert.ToSingle(i.getText());}
  ;

  // #表示括号内的表达方式为parent child ....即根节点为PLUS,然后分别计算第一个子和第二个子节点的expr值,填充到a,b
  // TreePaser呢相当于一个遍历树的方法,根据Paser构造的AST来遍历,前提是Parser里需要build ast以及使用^来标识根节点
评论Feed 评论Feed: /feed.asp?q=comment&id=272

标签: Antlr Parser

这篇日志没有评论.

发表
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
用户名:   密码:   (非注册用户不需要输入密码) 注册?
验证码(不区分大小写) * 请输入验证码