Rhino学习(1)

Rhino是Mozilla旗下的一个开源JavaScript解释器引擎,最近由于要做一些JavaScript上的词法分析,介于此,对Rhino进行学习和了解。

Rhino是基于Java的,对Java感兴趣的可以在 http://www.mozilla.org/rhino下载,如果某些同学认为Java太屌,喜欢C++,相信SpiderMonkey是个不错的选择。

直奔主题,我选择Rhino工作的目的就是构建JavaScript的抽象语法树

 1 import java.io.FileReader;
 2 import java.io.IOException;
 3 import java.io.Reader;
 4 import java.util.List;
 5 import org.mozilla.javascript.CompilerEnvirons;
 6 import org.mozilla.javascript.Parser;
 7 import org.mozilla.javascript.Token;
 8 import org.mozilla.javascript.ast.AstNode;
 9 import org.mozilla.javascript.ast.AstRoot;
10 import org.mozilla.javascript.ast.NodeVisitor;
11 
12 public class AST {
13     
14     public static void main(String[] args) throws IOException {
15         
16         class Visitor implements NodeVisitor{
17             public boolean visit(AstNode node) {
18                 System.out.println(node.getClass() + "   " +Token.typeToName(node.getType()));                
19                 return true;
20             }
21         }
22         
23         String file = "files/1.js";
24         Reader reader = new FileReader(file);
25         
26         try{
27             CompilerEnvirons env = new CompilerEnvirons();
28             
29             env.setRecordingLocalJsDocComments(true);
30             env.setAllowSharpComments(true);
31             env.setRecordingComments(true);
32             
33             AstRoot node = new Parser(env).parse(reader, file, 1);
34 
35             node.visit(new Visitor());
36             
37         }catch(IOException ee){
38             System.out.println(ee.toString());
39         }finally {
40             reader.close();
41         }
42     }
43 

来看主程序,其实很简单,先定义一个编译环境CompilerEnvirons,在其之上使用Parser对象生成抽象语法树,parse方法返回的AstRoot类型的结点,是这颗抽象语法树的根。得到了该抽象语法树的根后,便进行语法树的遍历工作。

继承NodeVisitor接口,实现visit方法,并在其中实现在遍历是需要进行的操作,使用AstRoot的visit方法,便对该棵语法树进行了遍历。

首先,编写一段要生成语法树的代码:

1 function foo() {
2     //tracy McGrady
3     alert('Hello, world!');
4 }

生成的语法树

class org.mozilla.javascript.ast.AstRoot   SCRIPT
class org.mozilla.javascript.ast.FunctionNode   FUNCTION
class org.mozilla.javascript.ast.Name   NAME
class org.mozilla.javascript.ast.Block   BLOCK
class org.mozilla.javascript.ast.ExpressionStatement   EXPR_VOID
class org.mozilla.javascript.ast.FunctionCall   CALL
class org.mozilla.javascript.ast.Name   NAME
class org.mozilla.javascript.ast.StringLiteral   STRING

由于代码较为简单,在显示语法树时,就没有显示缩进,但层次关系还是较为简单的,很好理解!

 

posted @ 2013-12-26 20:20  寂寞尘埃  阅读(737)  评论(0)    收藏  举报