jjTree和javaCC学习笔记
我们通过一个例子来研究jjtree。下面的例子是javacc自带的eg2.jjt例子的改进版本。
--------------------eg2.jjt------------------------------
options {
MULTI=true;
}
PARSER_BEGIN(eg2)
package test;
class eg2 {
public static void main(String args[]) {
System.out.println("Reading from standard input...");
eg2 t = new eg2(System.in);
try {
ASTStart n = t.Start(); // parse结果保存到n里面,这里Start是我们定义的一个非终结符
for (int i = 0; i < n.jjtGetNumChildren(); i++) {
Node node = n.jjtGetChild(i); //取得一个child,应该对应一个Expression
Token t;
for (t = node.first_token; t != node.last_token; t = t.next) {
System.out.print(t.image); // 输出这个token对应的文本
}
System.out.println(t.image); //输出node的最后一个token,并换行
}
n.dump(""); // 输出语法树的层次结构。
System.out.println("Thank you.");
} catch (Exception e) {
System.out.println("Oops.");
System.out.println(e.getMessage());
e.printStackTrace();
}
}
static void jjtreeOpenNodeScope( Node node )
{
((SimpleNode)node).first_token = getToken(1); //这里的first_token,last_token都要手工加到SimpleNode.java中
}
static void jjtreeCloseNodeScope( Node node )
{
((SimpleNode)node).last_token = getToken(0);
}
}
// token部分略去,没什么意思
ASTStart Start() : {}
{
Expression() ";"
{ return jjtThis; } //注意这里要写一句return,还有Start的返回值不能是void。
}
void Expression() : {}
{
AdditiveExpression()
}
void AdditiveExpression() #void : {}
// 这里可以设置#void,说明不必为此非终结符生成对象,也不会生成ASTAdditiveExpression类。
// 因此,Expression的child会包含MultiplicativeExpression
{
(
MultiplicativeExpression() ( ( "+" | "-" ) MultiplicativeExpression() )*
)
}
...
// 后面的很多细节都略去了,请参考自带例子,总之只要会BNF就可以了。
--------------------eg2.jjt------------------------------
2009年06月14日 23:26
//这里的first_token,last_token都要手工加到SimpleNode.java中
可以说具体一点吗