public void TestRepeat_n() { Parser parser; parser = Hammer.Repeat_n(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b')), 0x2); CheckParseFail(parser, "adef"); CheckParseOK(parser, "abdef", new object[] { 'a', 'b' }); CheckParseFail(parser, "dabdef"); }
public void TestMany() { Parser parser; parser = Hammer.Many(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b'))); CheckParseOK(parser, "", new object[] { }); CheckParseOK(parser, "a", new object[] { 'a' }); CheckParseOK(parser, "b", new object[] { 'b' }); CheckParseOK(parser, "aabbaba", new object[] { 'a', 'a', 'b', 'b', 'a', 'b', 'a' }); }
public void TestChoice() { Parser parser; parser = Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b')); CheckParseOK(parser, "a", 'a'); CheckParseOK(parser, "b", 'b'); CheckParseOK(parser, "ab", 'a'); CheckParseFail(parser, "c"); }
public void TestRightrec() { Parser parser; IndirectParser sp_rr = Hammer.Indirect(); sp_rr.Bind(Hammer.Choice(Hammer.Sequence(Hammer.Ch('a'), sp_rr), Hammer.Epsilon_p())); parser = sp_rr; CheckParseOK(parser, "a", new object[] { 'a' }); CheckParseOK(parser, "aa", new object[] { 'a', new object[] { 'a' } }); CheckParseOK(parser, "aaa", new object[] { 'a', new object[] { 'a', new object[] { 'a' } } }); }
public void TestNot() { Parser parser; parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Choice(Hammer.Token("+"), Hammer.Token("++")), Hammer.Ch('b')); CheckParseOK(parser, "a+b", new object[] { 'a', new byte[] { 0x2b }, 'b' }); CheckParseFail(parser, "a++b"); parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Choice(Hammer.Sequence(Hammer.Token("+"), Hammer.Not(Hammer.Ch('+'))), Hammer.Token("++")), Hammer.Ch('b')); CheckParseOK(parser, "a+b", new object[] { 'a', new object[] { new byte[] { 0x2b } }, 'b' }); CheckParseOK(parser, "a++b", new object[] { 'a', new byte[] { 0x2b, 0x2b }, 'b' }); }
public void TestSepBy1() { Parser parser; parser = Hammer.SepBy1(Hammer.Choice(Hammer.Ch('1'), Hammer.Ch('2'), Hammer.Ch('3')), Hammer.Ch(',')); CheckParseOK(parser, "1,2,3", new object[] { '1', '2', '3' }); CheckParseOK(parser, "1,3,2", new object[] { '1', '3', '2' }); CheckParseOK(parser, "1,3", new object[] { '1', '3' }); CheckParseOK(parser, "3", new object[] { '3' }); CheckParseFail(parser, ""); }
public void TestOptional() { Parser parser; parser = Hammer.Sequence(Hammer.Ch('a'), Hammer.Optional(Hammer.Choice(Hammer.Ch('b'), Hammer.Ch('c'))), Hammer.Ch('d')); CheckParseOK(parser, "abd", new object[] { 'a', 'b', 'd' }); CheckParseOK(parser, "acd", new object[] { 'a', 'c', 'd' }); CheckParseOK(parser, "ad", new object[] { 'a', null, 'd' }); CheckParseFail(parser, "aed"); CheckParseFail(parser, "ab"); CheckParseFail(parser, "ac"); }
public void TestAction() { Parser parser = Hammer.Action(Hammer.Sequence(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('A')), Hammer.Choice(Hammer.Ch('b'), Hammer.Ch('B'))), (HAction)(x => string.Join(",", (object[])x))); CheckParseOK(parser, "ab", "a,b"); CheckParseOK(parser, "AB", "A,B"); CheckParseFail(parser, "XX"); }
public void TestAttrBool() { Parser parser = Hammer.AttrBool(Hammer.Many1(Hammer.Choice(Hammer.Ch('a'), Hammer.Ch('b'))), (HPredicate)(x => { object[] elems = (object[])x; return(elems.Length > 1 && (char)elems[0] == (char)elems[1]); })); CheckParseOK(parser, "aa", new object[] { 'a', 'a' }); CheckParseOK(parser, "bb", new object[] { 'b', 'b' }); CheckParseFail(parser, "ab"); }
public void TestAmbiguous() { Parser parser; IndirectParser sp_d = Hammer.Indirect(); IndirectParser sp_p = Hammer.Indirect(); IndirectParser sp_e = Hammer.Indirect(); sp_d.Bind(Hammer.Ch('d')); sp_p.Bind(Hammer.Ch('+')); sp_e.Bind(Hammer.Choice(Hammer.Sequence(sp_e, sp_p, sp_e), sp_d)); parser = sp_e; CheckParseOK(parser, "d", 'd'); CheckParseOK(parser, "d+d", new object[] { 'd', '+', 'd' }); CheckParseOK(parser, "d+d+d", new object[] { new object[] { 'd', '+', 'd' }, '+', 'd' }); }