我通过JavaCC生成了一个解析器。然后,我会在我的方法中计算嵌套if
的数量。
我的文件.jjt是:
// TestParser.jjt
PARSER_BEGIN(TestParser)
public class TestParser {
public static void main(String[] args) throws ParseException {
TestParser parser = new TestParser(new java.io.StringReader(args[0]));
SimpleNode root = parser.program();
root.dump("");
}
}
PARSER_END(TestParser)
TOKEN : { <id : ["a"-"z","A"-"Z","_"] (["a"-"z","A"-"Z","0"-"9","_"])* }
/* Reserved words */
TOKEN :
{ < IF > | <begin> | <end> | < THEN > | < ELSEIF >| <STRING> | < ENDIF > |...}
SimpleNode MyProgram() #PROGRAM :
{}
{
(MyMethod ())* {return jjtThis;}
}
void MyMethod () #MyMethod : {}
{
<begin> id() "(" (Argument ())* ")" {}
(Statement ()) *
<end>
}
Token id() #ID:
{
Token t;
}
{
t=<ID> {jjtThis.value = t.image; return t;}
}
void Argument() #argument : {}
{
<String> id()
<int> id()
}
void statement () #statement : {}
{
ifElseStatement ()
// here other statement
}
void ifElseStatement () #ifElseStatement :{}
{
< IF > BooleanStructure() < THEN >
(
statement ()
)*
(
< ELSEIF > BooleanStructure() < THEN >
(
statement ()
)*
)*
< ELSE >
(
statement ()
)*
< ENDIF >
}
}
我可以为输入文件流生成AST。但是,我的问题是如何通过Design VISITOR遍历Tree因为我想要Count嵌套的If语句。提前谢谢
答案 0 :(得分:1)
使用VISITOR=true
选项。这将为每个节点类生成一个accept方法,并将创建一个访问者类应该实现的接口。请参阅https://javacc.java.net/doc/JJTree.html上的手册。
如果您还使用MULTI=true
,则界面更广泛。