📄 testrecursivedescentparser.cs
字号:
/** * Tests an unresolvable token conflict inside a production * alternative. */ public void TestElementTokenConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 0, 1); alt.AddToken(T1, 1, -1); AddAlternative(pattern, alt); AddPattern(parser, pattern); FailPrepareParser(parser); } /** * Tests an unresolvable production conflict inside a production * alternative. */ public void TestElementProductionConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddProduction(P2, 0, 1); alt.AddProduction(P3, 1, 1); alt.AddToken(T2, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P2, "P2"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, 1); alt.AddProduction(P2, 0, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P3, "P3"); alt = new ProductionPatternAlternative(); AddAlternative(pattern, alt); alt.AddToken(T1, 1, -1); AddPattern(parser, pattern); FailPrepareParser(parser); } /** * Tests an unresolvable production conflict in the tail of a * production alternative. */ public void TestElementTailConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddProduction(P2, 1, 1); alt.AddToken(T2, 0, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P2, "P2"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, 1); alt.AddToken(T2, 0, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); // TODO: enable this test // FailPrepareParser(parser); } /** * Tests a resolvable conflict between two production patterns. */ public void TestResolvableProductionConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddProduction(P2, 1, 1); AddAlternative(pattern, alt); alt = new ProductionPatternAlternative(); alt.AddProduction(P3, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P2, "P2"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, 1); alt.AddToken(T1, 0, 1); alt.AddToken(T2, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P3, "P3"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, -1); alt.AddToken(T3, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); PrepareParser(parser); } /** * Tests a resolvable conflict between two production * alternatives. */ public void TestResolvableAlternativeConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, 1); alt.AddToken(T1, 0, 1); alt.AddToken(T2, 1, 1); AddAlternative(pattern, alt); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, -1); alt.AddToken(T3, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); PrepareParser(parser); } /** * Tests a resolvable token conflict inside a production * alternative. */ public void TestResolvableElementTokenConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 0, 1); alt.AddToken(T1, 1, 1); alt.AddToken(T2, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); PrepareParser(parser); } /** * Tests a resolvable production conflict inside a production * alternative. */ public void TestResolvableElementProductionConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddProduction(P2, 0, 1); alt.AddToken(T1, 1, -1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P2, "P2"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, 1); alt.AddToken(T2, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); PrepareParser(parser); } /** * Tests a resolvable production conflict in the tail of a * production alternative. */ public void TestResolvableElementTailConflict() { Parser parser = CreateParser(); pattern = new ProductionPattern(P1, "P1"); alt = new ProductionPatternAlternative(); alt.AddProduction(P2, 1, 1); alt.AddToken(T2, 1, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); pattern = new ProductionPattern(P2, "P2"); alt = new ProductionPatternAlternative(); alt.AddToken(T1, 1, 1); alt.AddToken(T2, 0, 1); AddAlternative(pattern, alt); AddPattern(parser, pattern); PrepareParser(parser); } /** * Creates a new parser. * * @return a new parser */ private Parser CreateParser() { return new RecursiveDescentParser(null); } /** * Prepares the parser and reports a test failure if it failed. * * @param parser the parser to prepare */ private void PrepareParser(Parser parser) { try { parser.Prepare(); } catch (ParserCreationException e) { Fail(e.Message); } } /** * Prepares the parser and reports a test failure if it succeeded. * * @param parser the parser to prepare */ private void FailPrepareParser(Parser parser) { try { parser.Prepare(); Fail("succeeded in preparing parser"); } catch (ParserCreationException e) { // Failure was expected } } /** * Adds a production pattern to a parser and reports a test * failure if it failed. * * @param parser the parser to add a pattern to * @param pattern the production pattern to add */ private void AddPattern(Parser parser, ProductionPattern pattern) { try { parser.AddPattern(pattern); } catch (ParserCreationException e) { Fail("couldn't add pattern " + pattern.GetName() + ": " + e.Message); } } /** * Adds a production pattern to a parser and reports a test * failure if it succeeded. * * @param parser the parser to add a pattern to * @param pattern the production pattern to add */ private void FailAddPattern(Parser parser, ProductionPattern pattern) { try { parser.AddPattern(pattern); Fail("could add pattern " + pattern.GetName()); } catch (ParserCreationException e) { // Failure was expected } } /** * Adds a pattern alternative. This method reports a test failure * if an exception was thrown. * * @param pattern the production pattern * @param alt the pattern alternative to add */ private void AddAlternative(ProductionPattern pattern, ProductionPatternAlternative alt) { try { pattern.AddAlternative(alt); } catch (ParserCreationException e) { Fail("couldn't add alternative to " + pattern.GetName() + ": " + e.Message); } } /** * Throws a test fail exception. * * @param message the test error message */ private void Fail(string message) { throw new Exception(message); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -