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.asp?q=comment&id=272
如输入: 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.asp?q=comment&id=272
这篇日志没有评论.

