public void MarpaParseEngineShouldParseEncapsulatedRepeatingRightRecursiveRule() { var number = new NumberLexerRule(); var openBracket = new TerminalLexerRule('['); var closeBracket = new TerminalLexerRule(']'); var comma = new TerminalLexerRule(','); ProductionExpression A = "A", V = "V", VR = "VR"; A.Rule = openBracket + VR + closeBracket; VR.Rule = V | V + comma + VR | (Expr)null; V.Rule = number; var grammar = new GrammarExpression( A, new [] { A, V, VR }).ToGrammar(); var marpaParseEngine = new MarpaParseEngine(grammar); var tokens = new [] { new Token("[", 0, openBracket.TokenType), new Token("1", 1, number.TokenType), new Token(",", 2, comma.TokenType), new Token("2", 3, number.TokenType), new Token("]", 4, closeBracket.TokenType) }; for (var i = 0; i < tokens.Length; i++) { var result = marpaParseEngine.Pulse(tokens[i]); if (!result) { Assert.Fail($"Failure parsing at position {marpaParseEngine.Location}"); } } var accepted = marpaParseEngine.IsAccepted(); if (!accepted) { Assert.Fail($"Input was not accepted."); } }
public void DfaLexemeResetShouldResetLexemeValues() { var numberLexerRule = new NumberLexerRule(); var lexeme = numberLexerRule.CreateLexeme(0); const string numberInput = "0123456"; foreach (var character in numberInput) { var result = lexeme.Scan(character); if (!result) { Assert.Fail($"Did not recognize number {character}"); } } }
public void DfaLexemeResetShouldResetLexemeValues() { var numberLexerRule = new NumberLexerRule(); var whitespaceLexerRule = new WhitespaceLexerRule(); var lexeme = new DfaLexeme(numberLexerRule, 0); const string numberInput = "0123456"; for (var i = 0; i < numberInput.Length; i++) { var result = lexeme.Scan(numberInput[i]); if (!result) { Assert.Fail($"Did not recognize number {numberInput[i]}"); } } lexeme.Reset(whitespaceLexerRule, 50); Assert.AreEqual(string.Empty, lexeme.Value); Assert.AreEqual(50, lexeme.Position); Assert.AreEqual(whitespaceLexerRule.LexerRuleType, lexeme.LexerRule.LexerRuleType); Assert.AreEqual(whitespaceLexerRule.TokenType, lexeme.TokenType); }
static ExpressionGrammar() { var number = new NumberLexerRule(); ProductionExpression S = nameof(S), E = nameof(E), T = nameof(T), F = nameof(F); S.Rule = E; E.Rule = E + '+' + T | E + '-' + T | T; T.Rule = T + '*' + F | T + '/' + F | F; F.Rule = '+' + F | '-' + F | number | '(' + E + ')'; _grammar = new GrammarExpression(S).ToGrammar(); }