jjTree和javaCC学习笔记
我们通过一个例子来研究jjtree。下面的例子是javacc自带的eg2.jjt例子的改进版本。
-------------------SimpleNode.java---------------------
protected Token first_token;
protected Token last_token;
public void jjtOpen() {
first_token = parser.getToken(1);
}
public void jjtClose() {
last_token = parser.getToken(0);
}
--------------------eg2.jjt------------------------------
options {
MULTI=true;
}
PARSER_BEGIN(eg2)
package test;
public class Eg2 {
/** Main entry point. */
public static void main(String args[]) {
System.out.println("Reading from standard input...");
Eg2 t = new Eg2(System.in);
try {
ASTStart n = t.Start();
for (int i = 0; i < n.jjtGetNumChildren(); i++) {
Node node = n.jjtGetChild(i); //取得一个child,应该对应一个Expression
Token t1;
for (t1 = ((SimpleNode)node).first_token; t1 != ((SimpleNode)node).last_token; t1 = t1.next) {
System.out.print(t1.image); // 输出这个token对应的文本
}
System.out.println(t1.image); //输出node的最后一个token,并换行
}
n.dump("");
System.out.println("Thank you.");
} catch (Exception e) {
System.out.println("Oops.");
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
// 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------------------------------
本文档详细记录了jjTree和javaCC的学习过程,通过分析一个改进后的eg2.jjt示例,探讨如何使用jjTree进行语法分析,并展示了如何在生成的抽象语法树中遍历节点和处理Token。主要涉及SimpleNode的jjtOpen和jjtClose方法,以及如何在表达式解析中处理AdditiveExpression和MultiplicativeExpression。

1375

被折叠的 条评论
为什么被折叠?



