锁定老帖子 主题:jjTree解析
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-07
这篇文章可以算是这篇小型桌面计算器的实现(javacc) 的续。
可以这么说,使用javacc作分析器生成器,如果没有用到jjTree,那么就是对语义分析
的过程理解不够深入。如果用到了jjTree而且用好了,那么对编译原理,BNF等的理解才算是比较到位了。 …… /** This method tells the node to add its argument to the node's list of children. */ public void jjtAddChild(Node n, int i); /** 返回孩子节点,下标从0开始,从左到右 */ public Node jjtGetChild(int i); /** 返回字节点个数 */ int jjtGetNumChildren(); ……
在本文所举的例子中,每个节点还要实现这样一个接口中声明的方法: void interpret() 这个方法中为每个节点具体的计算过程。
jjTree处理的脚本(jjTree规则列表)以jjt结尾,这个文件通过jjtree工具可以生成.jj文件,然后用javacc编译.jj文件即可生成分析器生成器的java代码,然后于一些辅助解析的类进行编译,从而最终完成整个脚本引擎。 /** Conditional or expression. */ void ConditionalOrExpression() #void : {} { ConditionalAndExpression() ( "||" ConditionalAndExpression() #OrNode(2) )* }
public void interpret() { jjtGetChild(0).interpret(); if (((Boolean)stack[top]).booleanValue()) { stack[top] = new Boolean(true); return; } jjtGetChild(1).interpret(); stack[--top] = new Boolean(((Boolean)stack[top]).booleanValue() || ((Boolean)stack[top + 1]).booleanValue()); }
/** A block. */ void Block() : {} { "{" ( Statement() )* "}" }
public void interpret() { int i, k = jjtGetNumChildren();//取出代码块中的代码条数 for (i = 0; i < k; i++) jjtGetChild(i).interpret();//递归解析 }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-15
jjTree好难喔。跟普通的jj貌似隔了好几个量级。晕。。。看了良久,不懂。。。
|
|
返回顶楼 | |
发表时间:2009-08-15
952222 写道 jjTree好难喔。跟普通的jj貌似隔了好几个量级。晕。。。看了良久,不懂。。。
呵呵,jjTree其实就是用于写脚本分析器(包含规约的语言)的时候要用到,如果只是做解析(比如配置文件之类的)就不需要了,其实主要是编译技术方面的原理,看一看语法分析和语义分析部分,应该就好理解了。 |
|
返回顶楼 | |
发表时间:2009-09-15
风之巽 写道 您好!请问关于符号表的建立有没有相关的例子啊?
最近看论文关于增量编译的,提到了复用子树的概念,就是将上一次分析得到的树中的可复用的结点直接移进解析栈,而不用一个个终结符来分析。。。 可是javacc中关于jjtree我还是很不了解,想要建立解析表之类的也不知道怎么样开始,能帮忙指点下吗??谢谢您! javacc的例子中有一个interpreter,解释一个叫SPL的小语言(也就是我这篇文章给出的例子的来源),其中用到了符号表,其实就是一个hashtable,当遇到终结符后,将键值对插入其中。其实就是一个全局的表结构,可以从中根据名称取出值来。另,不用这么客气。 |
|
返回顶楼 | |
浏览 7203 次