-1

アプリケーションで Javacc パーサー ジェネレーターを使用しており、文法の単体テストを行いたいと考えています。

gUnit が ANTLR 用であるように、javacc 用の単体テスト フレームワークがあるかどうかを知りたいです。そうでない場合、この文法をテストする最良の方法は何ですか?

4

1 に答える 1

12

フレームワークはありませんが、私の本の example codeには、JavaCC と JJTree の両方の文法のテストの例がいくつかあります。


Tom Copeland は、古典的なGenerating Parsers with JavaCCの著者です。参照されているサンプルコードは無料で入手できます。

以下は、単純な 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();
    }
}

文法自体:

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"])*>
}
于 2011-04-03T23:58:01.160 に答える