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

浙公网安备 33010602011771号