Javacc:nested-if-statements

时间:2015-06-09 12:00:46

标签: javacc

我通过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语句。提前谢谢

1 个答案:

答案 0 :(得分:1)

使用VISITOR=true选项。这将为每个节点类生成一个accept方法,并将创建一个访问者类应该实现的接口。请参阅https://javacc.java.net/doc/JJTree.html上的手册。

如果您还使用MULTI=true,则界面更广泛。