Javacc的单元测试

Pre*_*raj -1 java unit-testing javacc

我在我的应用程序中使用Javacc解析器生成器,并希望对我的语法进行一些单元测试.

我想知道是否有任何javacc的单元测试框架,比如gUnit用于ANTLR.如果没有,那么测试这种语法的最佳方法是什么?

tom*_*and 12

没有框架,但在我的书的示例代码中有一些JavaCC和JJTree语法测试的例子.


Tom Copeland是使用JavaCC的经典Generating Parsers的作者.所引用的示例代码是免费提供的.

下面是一个简单的Robot语法的示例测试用例:

public class RobotTest {

    @Test
    public void tokenizeMoveCommand() {
        String cmd = "STEP 10";
        SimpleCharStream cs = new SimpleCharStream(new StringReader(cmd));
        RobotTokenManager ltm = new RobotTokenManager(cs);
        Token t = ltm.getNextToken();
        assertEquals(RobotConstants.STEP, t.kind);
        t = ltm.getNextToken();
        assertEquals(RobotConstants.NUM, t.kind);
    }

    @Test(expected = TokenMgrError.class)
    public void tokenizeFailure() {
        String cmd = "STOP 10";
        SimpleCharStream cs = new SimpleCharStream(new StringReader(cmd));
        RobotTokenManager ltm = new RobotTokenManager(cs);
        ltm.getNextToken();
    }
}
Run Code Online (Sandbox Code Playgroud)

语法本身:

options {
    BUILD_PARSER=false;
    STATIC=false;
}
PARSER_BEGIN(Robot)

public class Robot {}
PARSER_END(Robot)
TOKEN_MGR_DECLS: {
  public static void main(String[] args) throws Exception {
    java.io.Reader r = new java.io.FileReader(args[0]);
    SimpleCharStream scs = new SimpleCharStream(r);
    RobotTokenManager mgr = new RobotTokenManager(scs);
    for (Token t = mgr.getNextToken(); t.kind != EOF;
      t = mgr.getNextToken()) {
        System.out.println("Found a " + RobotConstants.tokenImage[t.kind] + ": " + t.image);
    }
  }
}    
SKIP :
{
    " "
|   "\n"
|   "\r"
|   "\r\n"
}
TOKEN :
{
    <STEP   :   "STEP">
|   <RIGHT  :   "RIGHT">
|   <LEFT   :   "LEFT">
|   <NUM    :   (["1"-"9"])+ (["0"-"9"])*>
}
Run Code Online (Sandbox Code Playgroud)

  • @tomcopeland我希望你不介意我的编辑,让你的答案完全符合SO指南.如果我做得太多,请随时回复.谢谢你的出色工作. (18认同)
  • @lexicore:优秀的编辑和非常好的你,这就是答案应该首先看到的. (4认同)
  • 根据[FAQ](http://stackoverflow.com/faq#promotion)`"小心,因为社区对公开的自我推销感到不满,并倾向于将其投票并将其标记为垃圾邮件.发布好的相关答案,如果它们恰好与您的产品或网站有关,那么就这样吧.但是,您必须在答案中披露您的从属关系.此外,如果您的帖子中有很大一部分包括提及您的产品或网站,那么您可能就在这里出于错误的原因."`虽然你的自我推销是主题,"如果你买我的书,你会发现答案"并不完全有用. (3认同)
  • 很高兴知道.但是,请注意,你发现了一些垃圾邮件标志; 获得五,这将被删除,你失去100代表. (3认同)
  • 是的,但示例代码可以在该链接免费获得...无需购买本书......他们可以下载示例并查看"test"章节目录中的示例. (2认同)