アプリケーションで Javacc パーサー ジェネレーターを使用しており、文法の単体テストを行いたいと考えています。
gUnit が ANTLR 用であるように、javacc 用の単体テスト フレームワークがあるかどうかを知りたいです。そうでない場合、この文法をテストする最良の方法は何ですか?
アプリケーションで Javacc パーサー ジェネレーターを使用しており、文法の単体テストを行いたいと考えています。
gUnit が ANTLR 用であるように、javacc 用の単体テスト フレームワークがあるかどうかを知りたいです。そうでない場合、この文法をテストする最良の方法は何ですか?
フレームワークはありませんが、私の本の 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"])*>
}