Esempio n. 1
0
        static void Main(string[] args)
        {
            var sampleBnf = @"
            <syntax>         ::= <rule> | <rule> <syntax>
            <rule>           ::= <identifier> ""::="" <expression> <line-end>
            <expression>     ::= <list> | <list> ""|"" <expression>
            <line-end>       ::= <EOL> | <line-end> <line-end>
            <list>           ::= <term > | <term> <list>
            <term>           ::= <literal > | <identifier>
            <identifier>     ::= ""<"" <rule-name> "">""
            <literal>        ::= '""' <text> '""' | ""'"" <text> ""'""";

            var grammar = new BnfGrammar();

            for (long i = 0; i < 10000; i++)
            {
                var parseEngine = new ParseEngine(grammar);
                var parseInterface = new ParseInterface(parseEngine, sampleBnf);
                var stringReader = new StringReader(sampleBnf);

                while (!parseInterface.EndOfStream() && parseInterface.Read()) { }

                var result = parseInterface.ParseEngine.IsAccepted();
            }
        }
Esempio n. 2
0
        public void TestParseEngine45()
        {
            var engine = new ParseEngine();
            var json   = "[,\"a\", ]";

            Assert.Throws(typeof(ArgumentException), () => engine.Parse(json));
        }
Esempio n. 3
0
        public Regex Parse(string regularExpression)
        {
            var grammar     = new RegexGrammar();
            var parseEngine = new ParseEngine(grammar, new ParseEngineOptions());
            var parseRunner = new ParseRunner(parseEngine, regularExpression);

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    throw new Exception(
                              $"Unable to parse regular expression. Error at position {parseRunner.Position}.");
                }
            }

            if (!parseEngine.IsAccepted())
            {
                throw new Exception(
                          $"Error parsing regular expression. Error at position {parseRunner.Position}");
            }

            var parseTree = parseEngine.GetParseTree();

            var regexVisitor = new RegexVisitor();

            parseTree.Accept(regexVisitor);

            return(regexVisitor.Regex);
        }
Esempio n. 4
0
        public override IEnumerable <OutputRecord> Execute(ParseEngine context)
        {
            context.Log(ToString());
            context.Log("{");
//            if (!context.Grammar.IsTokenGrammar)
//                Console.WriteLine("Executing " + Name);
            IEnumerable <OutputRecord> nonterminal = context.ApplyNonterminal(this, context.Position);

//            if (!context.Grammar.IsTokenGrammar)
//                Console.WriteLine("Executed " + Name);
//            if (!context.IsFailure(nonterminal) && !context.Grammar.IsTokenGrammar)
//                Logger.WriteLine("Accepted " + Name + " (" + nonterminal.Concatenate(" ", o => o.OutputType == OutputType.None ? o.ToString() : "") + ")");

            if (context.IsFailure(nonterminal))
            {
                context.Log(ParseEngine.Indent + "Failed");
            }
            else
            {
                context.Log(ParseEngine.Indent + "Succeeded");
            }

            context.Log("}");

            return(nonterminal);
        }
Esempio n. 5
0
        public void TestJObject02()
        {
            var employee = new EmployeeJson
            {
                Name       = "Alan",
                Department = "hardware",
                Married    = true,
                Position   = "manager",
                Dob        = new DateTime(1975, 10, 2),
                Site       = Site.London,
                Age        = 40
            };
            var context = JsonMapper.NewContext().UseDateFormat(string.Empty).For <EmployeeJson>(y => y.MapProperty(x => x.Dob).With("Birthday"));
            var json    = context.ToJson(employee);
            var engine  = new ParseEngine();
            var emp     = engine.Parse(json) as JObject;

            Assert.NotNull(emp);
            Assert.Equal("Alan", emp.GetString("Name"));
            Assert.Equal("hardware", emp.GetString("Department"));
            Assert.Equal("manager", emp.GetString("Position"));
            Assert.Equal(40, emp.GetInt32("Age"));
            Assert.True(emp.GetBool("Married"));
            var dt = DateTime.Parse(emp.GetString("Birthday"));

            Assert.Equal(1975, dt.Year);
            Assert.Equal(10, dt.Month);
            Assert.Equal(2, dt.Day);
        }
Esempio n. 6
0
        public void ParseEngineWhenScanCompletedShouldCreateInternalAndTerminalNodes()
        {
            ProductionExpression S = "S";

            S.Rule = (Expr)'a';

            var grammar = new GrammarExpression(S, new[] { S })
                          .ToGrammar();

            var tokens      = Tokenize("a");
            var parseEngine = new ParseEngine(grammar);

            ParseInput(parseEngine, tokens);

            var parseNode = parseEngine.GetParseForestRootNode();

            Assert.IsNotNull(parseNode);

            var S_0_1 = parseNode as ISymbolForestNode;

            Assert.IsNotNull(S_0_1);
            Assert.AreEqual(1, S_0_1.Children.Count);

            var S_0_1_1 = S_0_1.Children[0] as IAndForestNode;

            Assert.IsNotNull(S_0_1_1);
            Assert.AreEqual(1, S_0_1_1.Children.Count);

            var a_0_1 = S_0_1_1.Children[0] as ITokenForestNode;

            Assert.IsNotNull(a_0_1);
            Assert.AreEqual("a", a_0_1.Token.Value);
        }
Esempio n. 7
0
        public Regex Parse(string regularExpression)
        {
            var grammar     = new RegexGrammar();
            var parseEngine = new ParseEngine(grammar, new ParseEngineOptions(optimizeRightRecursion: true));
            var parseRunner = new ParseRunner(parseEngine, regularExpression);

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    throw new Exception(
                              $"Unable to parse regular expression. Error at position {parseRunner.Position}.");
                }
            }
            if (!parseEngine.IsAccepted())
            {
                throw new Exception(
                          $"Error parsing regular expression. Error at position {parseRunner.Position}");
            }

            var parseForest = parseEngine.GetParseForestRootNode();

            var parseTree = new InternalTreeNode(
                parseForest as IInternalForestNode,
                new SelectFirstChildDisambiguationAlgorithm());

            var regexVisitor = new RegexVisitor();

            parseTree.Accept(regexVisitor);

            return(regexVisitor.Regex);
        }
Esempio n. 8
0
#pragma warning disable CC0091 // Use static method
        public EbnfDefinition Parse(string ebnf)
        {
            var grammar     = new EbnfGrammar();
            var parseEngine = new ParseEngine(
                grammar,
                new ParseEngineOptions(
                    optimizeRightRecursion: true,
                    loggingEnabled: false));
            var parseRunner = new ParseRunner(parseEngine, ebnf);

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    throw new Exception(
                              $"Unable to parse Ebnf. Error at line {parseRunner.Line}, column {parseRunner.Column}.");
                }
            }
            if (!parseEngine.IsAccepted())
            {
                throw new Exception(
                          $"Ebnf parse not accepted. Error at line {parseRunner.Line}, column {parseRunner.Column}.");
            }

            var parseForest = parseEngine.GetParseForestRootNode();

            var parseTree = new InternalTreeNode(
                parseForest as IInternalForestNode,
                new SelectFirstChildDisambiguationAlgorithm());

            var ebnfVisitor = new EbnfVisitor();

            parseTree.Accept(ebnfVisitor);
            return(ebnfVisitor.Definition);
        }
Esempio n. 9
0
        public void TestParseEngine46()
        {
            var engine = new ParseEngine();
            var json   = "{\"a\": \"b\", \"c\"}";

            Assert.Throws(typeof(ArgumentException), () => engine.Parse(json));
        }
Esempio n. 10
0
        public void TestParseEngine22()
        {
            var json        = "21.0002345";
            var parseEngine = new ParseEngine();

            Assert.Equal("21.0002345", (parseEngine.Parse(json) as JNumber).Value);
        }
Esempio n. 11
0
        public void TestParseEngine19()
        {
            var json        = "{\"name\": \"Jack\", \"country\": \"usa\", \"age\": 30, \"married\": false, \"child\": Nill}";
            var parseEngine = new ParseEngine();

            Assert.Throws(typeof(ArgumentException), () => parseEngine.Parse(json));
        }
Esempio n. 12
0
        public void TestParseEngine20()
        {
            var json        = "\"Jason\"";
            var parseEngine = new ParseEngine();

            Assert.Equal("Jason", parseEngine.Parse(json).Value);
        }
Esempio n. 13
0
        public void ParseRunnerShouldEmitTokenWhenIgnoreCharacterIsEncountered()
        {
            const string         input = "aa aa";
            ProductionExpression S     = "S";

            S.Rule = _wordRule + S | _wordRule;

            var grammar = new GrammarExpression(
                S,
                new[] { S },
                new[] { _whitespaceRule },
                null)
                          .ToGrammar();

            var parseEngine = new ParseEngine(grammar);
            var parseRunner = new ParseRunner(parseEngine, input);
            var chart       = GetParseEngineChart(parseEngine);

            for (int i = 0; i < 2; i++)
            {
                Assert.IsTrue(parseRunner.Read());
            }
            Assert.IsTrue(parseRunner.Read());
            Assert.AreEqual(2, chart.EarleySets.Count);
        }
Esempio n. 14
0
        public void ParseRunnerWhenNoLexemesMatchCharacterShouldCreateNewLexeme()
        {
#if false
            const string input = "aaaa";

            ProductionExpression A = "A", S = "S";

            A.Rule = (Expr)'a' + 'a';
            var aGrammar = new GrammarExpression(A, new[] { A }).ToGrammar();
            var a = new GrammarLexerRule("a", aGrammar);

            S.Rule = (a + S) | a;
            var grammar = new GrammarExpression(S, new[] { S }).ToGrammar();

            var parseEngine = new ParseEngine(grammar);
            var parseRunner = new ParseRunner(parseEngine, input);

            var chart = GetParseEngineChart(parseEngine);
            for (var i = 0; i < 3; i++)
            {
                Assert.IsTrue(parseRunner.Read());
            }

            Assert.AreEqual(2, chart.Count);
#endif
        }
Esempio n. 15
0
        public void EbnfParserShouldParseComplexGrammarWithRepeat()
        {
            var stringBuilder = new StringBuilder()
                                //.AppendLine("file = ws directives ws ;")
                                .AppendLine("file = \"1\" { \"2\" } \"1\";");
            //.AppendLine("directives = directive { ows directive };")
            //.AppendLine("directive = \"0\" | \"1\"; ");

            var actual = Parse(stringBuilder.ToString());

            var grammar     = new EbnfGrammar();
            var parseEngine = new ParseEngine(grammar, new ParseEngineOptions(false));
            var parseRunner = new ParseRunner(parseEngine, stringBuilder.ToString());

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    throw new Exception(
                              $"Unable to parse Ebnf. Error at position {parseRunner.Position}.");
                }
            }
            if (!parseEngine.IsAccepted())
            {
                throw new Exception(
                          $"Unable to parse Ebnf. Error at position {parseRunner.Position}");
            }

            var parseForest = parseEngine.GetParseForestRootNode();
            var visitor     = new LoggingForestNodeVisitor(Console.Out);

            parseForest.Accept(visitor);
        }
Esempio n. 16
0
        public bool Parse()
        {
            var parseEngine = new ParseEngine(_grammar);
            var parseRunner = new ParseRunner(parseEngine, _sampleBnf);

            return(parseRunner.RunToEnd());
        }
Esempio n. 17
0
        public IEbnfDefinition Parse(string ebnf)
        {
            var grammar     = new EbnfGrammar();
            var parseEngine = new ParseEngine(
                grammar,
                new ParseEngineOptions());
            var parseRunner = new ParseRunner(parseEngine, ebnf);

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    throw new Exception(
                              $"Unable to parse Ebnf. Error at line {parseRunner.Line}, column {parseRunner.Column}.");
                }
            }
            if (!parseEngine.IsAccepted())
            {
                throw new Exception(
                          $"Ebnf parse not accepted. Error at line {parseRunner.Line}, column {parseRunner.Column}.");
            }

            var parseTree = parseEngine.GetParseTree();

            var ebnfVisitor = new EbnfVisitor();

            parseTree.Accept(ebnfVisitor);
            return(ebnfVisitor.Definition);
        }
Esempio n. 18
0
 public IEnumerable <IEnumerable <OutputRecord> > GetResults(ParseEngine engine, IEnumerable <OutputRecord> first)
 {
     do
     {
         yield return(first);
     }while (!engine.IsFailure(first = Operand.Execute(engine)));
 }
Esempio n. 19
0
        public void AycockHorspoolAlgorithmShouldAcceptVulnerableGrammar()
        {
            var a = new TerminalLexerRule(
                new CharacterTerminal('a'),
                new TokenName("a"));

            ProductionExpression
                SPrime = "S'",
                S      = "S",
                A      = "A",
                E      = "E";

            SPrime.Rule = S;
            S.Rule      = (Expr)S | (A + A + A + A);
            A.Rule      = (Expr)"a" | E;

            var expression = new GrammarExpression(
                SPrime,
                new[] { SPrime, S, A, E });

            var grammar = expression.ToGrammar();

            var parseEngine = new ParseEngine(grammar);

            parseEngine.Pulse(new VerbatimToken(a.TokenName, 0, "a"));

            //var privateObject = new PrivateObject(parseEngine);
            //var chart = privateObject.GetField("_chart") as Chart;
            var chart = parseEngine.Chart;

            Assert.IsNotNull(chart);
            Assert.AreEqual(2, chart.Count);
            Assert.IsTrue(parseEngine.IsAccepted());
        }
Esempio n. 20
0
        public void TestParseEngine07()
        {
            var json        = "{\"name\": \"Jack\", \"country\": \"usa\", \"age\": .30}";
            var parseEngine = new ParseEngine();

            Assert.Throws(typeof(ArgumentException), () => parseEngine.Parse(json));
        }
Esempio n. 21
0
        public void RunMain()
        {
            Proposition expr;
            string      result;

            //string s = "( p -> ( q & r ) ) <-> y";
            //string s = "(A ->( B -> C )) <-> ( C -> D ) & ( D -> E) ";
            //string s = "p<->p";
            //string s = "p <-> a & b";
            //string s = "((p | q) & (~p | r)) -> (q | r)";
            //string s = "(P|(S&T))|R";
            //string s = "(A&B)|(~A)|(~B)";
            //string s = "(~p)<->(p->F)";
            //string s = "(~((a&b)|c)&d)|(((a&b)|c)&(~d))";
            string      s           = "(a&b)|(c&d)|(e&f)";
            ParseEngine parseEngine = new ParseEngine();

            parseEngine.TryParse(out expr, out result, s);

            LogicEngine logicEng = new LogicEngine();
            Proposition nnfExpr  = logicEng.ConvertToNNF(expr);

            Proposition cnfExpr = logicEng.ConvertToCNF(nnfExpr);
            bool        b       = logicEng.IsTautology(cnfExpr);

            WriteFile(cnfExpr.ToString());
        }
        public void Test_AycockHorspoolAlgorithm_That_Vulnerable_Grammar_Accepts_Input()
        {
            var a = new TerminalLexerRule(
                new Terminal('a'),
                new TokenType("a"));

            var grammar = new GrammarBuilder("S'")
            .Production("S'", r => r
                .Rule("S"))
            .Production("S", r => r
                .Rule("A", "A", "A", "A"))
            .Production("A", r => r
                .Rule(a)
                .Rule("E"))
            .Production("E", r => r
                .Lambda())
            .ToGrammar();

            var parseEngine = new ParseEngine(grammar);
            parseEngine.Pulse(new Token("a", 0, a.TokenType));

            var privateObject = new PrivateObject(parseEngine);
            var chart = privateObject.GetField("_chart") as Chart;

            Assert.IsNotNull(chart);
            Assert.AreEqual(2, chart.Count);
            Assert.IsTrue(parseEngine.IsAccepted());
        }
Esempio n. 23
0
            public IInternalTreeNode Parse(string source)
            {
                var grammar = MakeGrammar();

                var parseEngine = new ParseEngine(
                    grammar,
                    new ParseEngineOptions(loggingEnabled: true));
                var parseRunner = new ParseRunner(parseEngine, source);

                while (!parseRunner.EndOfStream())
                {
                    if (!parseRunner.Read())
                    {
                        throw new Exception(
                                  $"Unable to parse expression. Error at line {parseRunner.Line+1}, column {parseRunner.Column+1}.");
                    }

                    Console.WriteLine("-----");
                    Console.ReadKey(true);
                }
                if (!parseEngine.IsAccepted())
                {
                    throw new Exception(
                              $"expression parse not accepted. Error at line {parseRunner.Line+1}, column {parseRunner.Column+1}.");
                }

                return(parseEngine.GetParseTree());
            }
Esempio n. 24
0
        public void TestParseEngine28()
        {
            var json =
                "{\"english\": {\"top\": [\"arsenal\", \"man utd\", \"chelsea\", \"man city\"], \"holder\": \"chelsea\"}, \"spain\": {\"top\": [\"barcelona\", \"real\"], \"holder\": \"barcelona\"}}";
            var parseEngine = new ParseEngine();
            var value       = parseEngine.Parse(json) as JObject;

            Assert.NotNull(value);
            var english = value["english"] as JObject;

            Assert.NotNull(english);
            var englishTop = english["top"] as JArray;

            Assert.NotNull(englishTop);
            Assert.Equal("arsenal", englishTop[0].Value);
            Assert.Equal("man utd", englishTop[1].Value);
            Assert.Equal("chelsea", englishTop[2].Value);
            Assert.Equal("man city", englishTop[3].Value);
            Assert.Equal("chelsea", english["holder"].Value);
            var spain = value["spain"] as JObject;

            Assert.NotNull(spain);
            var spainTop = spain["top"] as JArray;

            Assert.NotNull(spainTop);
            Assert.Equal("barcelona", spainTop[0].Value);
            Assert.Equal("real", spainTop[1].Value);
            Assert.Equal("barcelona", spain["holder"].Value);
        }
Esempio n. 25
0
        public override IEnumerable <OutputRecord> Execute(ParseEngine engine)
        {
            var result = NoResults;
            IEnumerable <OutputRecord> current;

            var mark = engine.Mark();

            int count;

            for (count = 0; !engine.IsFailure(current = Operand.Execute(engine)); count++)
            {
                if (count > Max)
                {
                    engine.Reset(mark);
                    return(null);
                }

                result = result.Concat(current);
            }

            if (count < Min)
            {
                engine.Reset(mark);
                return(null);
            }

            return(result);
        }
Esempio n. 26
0
        public void TestParseEngine03()
        {
            var json        = "{\"nam\"e\": \"Jack\"}{";
            var parseEngine = new ParseEngine();

            Assert.Throws(typeof(ArgumentException), () => parseEngine.Parse(json));
        }
Esempio n. 27
0
        public void ParseRunnerShouldHandleCleanupOfUnUsedIgnoreLexemes()
        {
            var grammar     = new PdlGrammar();
            var parseEngine = new ParseEngine(grammar);

            var stringBuilder = new StringBuilder()
                                .AppendLine("ws = [ ows ] ; /* white space */")
                                .AppendLine("ows = \"_\" ; /* obligatory white space */");

            RunParse(parseEngine, stringBuilder.ToString());

            var chart = parseEngine.Chart;

            Assert.IsTrue(chart.EarleySets.Count > 7);
            var seventhSet = chart.EarleySets[7];

            Assert.IsNotNull(seventhSet);

            Assert.AreEqual(1, seventhSet.Completions.Count);
            var onlyCompletion = seventhSet.Completions[0];

            Assert.IsNotNull(onlyCompletion);

            var parseNode        = onlyCompletion.ParseNode as IInternalForestNode;
            var parseNodeAndNode = parseNode.Children[0];
            var tokenParseNode   = parseNodeAndNode.Children[0] as ITokenForestNode;
            var token            = tokenParseNode.Token;

            Assert.AreEqual(PdlGrammar.TokenTypes.Identifier, token.TokenType);
            Assert.AreEqual("ows", token.Capture.ToString());
        }
Esempio n. 28
0
        public void ParseEngineShouldHandleTransitionsFromRightRecursionToNormalGrammar()
        {
            var grammar = CreateRegularExpressionStubGrammar();

            var input       = Tokenize("aaaa");
            var parseEngine = new ParseEngine(grammar);

            ParseInput(parseEngine, input);

            // R_0_7 -> E_0_7
            // E_0_7 -> T_0_7
            // T_0_7 -> F_0_1 T_1_7
            // F_0_1 -> 'a'
            // T_1_7 -> F_1_2 T_2_7
            // F_1_2 -> 'a'
            // T_2_7 -> F_2_3 T_3_7
            // F_2_3 -> 'a'
            // T_3_7 -> F_3_4 T_4_7
            // F_3_4 -> 'a'
            // T_4_7 -> F_4_5 T_5_7
            // F_4_5 -> 'a'
            // T_5_7 -> F_5_6 T_6_7
            // F_5_6 -> 'a'
            // T_6_7 -> F_6_7
            // F_6_7 -> 'a'

            var parseForestRoot = parseEngine.GetParseForestRootNode();
            var root            = parseForestRoot;
            var R_0_4           = CastAndCountChildren <ISymbolForestNode>(root, 1);

            AssertNodeProperties(R_0_4, "R", 0, 4);
            var E_0_4 = GetAndCastChildAtIndex <ISymbolForestNode>(R_0_4, 0);

            AssertNodeProperties(E_0_4, "E", 0, 4);
            var T_0_4 = GetAndCastChildAtIndex <ISymbolForestNode>(E_0_4, 0);

            AssertNodeProperties(T_0_4, "T", 0, 4);
            var F_0_1 = GetAndCastChildAtIndex <ISymbolForestNode>(T_0_4, 0);

            AssertNodeProperties(F_0_1, "F", 0, 1);
            var T_1_4 = GetAndCastChildAtIndex <ISymbolForestNode>(T_0_4, 1);

            AssertNodeProperties(T_1_4, "T", 1, 4);
            var F_1_2 = GetAndCastChildAtIndex <ISymbolForestNode>(T_1_4, 0);

            AssertNodeProperties(F_1_2, "F", 1, 2);
            var T_2_4 = GetAndCastChildAtIndex <ISymbolForestNode>(T_1_4, 1);

            AssertNodeProperties(T_2_4, "T", 2, 4);
            var F_2_4 = GetAndCastChildAtIndex <ISymbolForestNode>(T_2_4, 0);

            AssertNodeProperties(F_2_4, "F", 2, 3);
            var T_3_4 = GetAndCastChildAtIndex <ISymbolForestNode>(T_2_4, 1);

            AssertNodeProperties(T_3_4, "T", 3, 4);
            var F_3_4 = GetAndCastChildAtIndex <ISymbolForestNode>(T_3_4, 0);

            AssertNodeProperties(F_3_4, "F", 3, 4);
        }
Esempio n. 29
0
        public static T To <T>(string json, Transformer <JValue, T> transform)
        {
            Guarder.CheckNull(transform, "transform");
            var engine = new ParseEngine();
            var value  = engine.Parse(json);

            return(transform(value));
        }
Esempio n. 30
0
        public static T To <T>(string json, IJsonConverter <T> converter)
        {
            Guarder.CheckNull(converter, "converter");
            var engine = new ParseEngine();
            var value  = engine.Parse(json);

            return(converter.Convert(value));
        }
Esempio n. 31
0
 private ParseResult ParseString(string data)
 {
     ParseEngine parser = new ParseEngine();
     using (StringReader stream = new StringReader(data))
     {
         return parser.Parse(stream);
     }
 }
Esempio n. 32
0
        public void TestParseEngine30()
        {
            var engine = new ParseEngine();
            var json   = "[]";
            var array  = engine.Parse(json) as JArray;

            Assert.Equal(0, array.Length);
        }
Esempio n. 33
0
        public void Test_Lexeme_That_Consumes_Character_Sequence()
        {
            var grammar = new GrammarBuilder("sequence")
                .Production("sequence", r => r
                    .Rule('a', 'b', 'c', '1', '2', '3'))
                .ToGrammar();

            var parseEngine = new ParseEngine(grammar);
            var lexeme = new ParseEngineLexeme(parseEngine, new TokenType("sequence"));
            var input = "abc123";
            for (int i = 0; i < input.Length; i++)
                Assert.IsTrue(lexeme.Scan(input[i]));
            Assert.IsTrue(lexeme.IsAccepted());
        }
Esempio n. 34
0
        public void Test_Bnf_That_Parses_Large_Grammar_In_File()
        {
            var bnf = File.ReadAllText(Path.Combine(TestContext.TestDeploymentDir, "Bnf", "AnsiC.bnf"));
            Assert.IsFalse(string.IsNullOrEmpty(bnf));

            var grammar = new BnfGrammar();
            var parseEngine = new ParseEngine(grammar);
            var parseInterface = new ParseInterface(parseEngine, bnf);

            while (!parseInterface.EndOfStream())
            {
                if (!parseInterface.Read())
                    Assert.Fail("Error Parsing At Position {0}", parseInterface.Position);
            }
            Assert.IsTrue(parseEngine.IsAccepted());
        }
Esempio n. 35
0
        public void Test_NodeWalker_That_Walks_Simple_Regex()
        {
            var regexGrammar = new RegexGrammar();
            var regexParseEngine = new ParseEngine(regexGrammar);
            var regexParseInterface = new ParseInterface(regexParseEngine, @"[(]\d[)]");
            while (!regexParseInterface.EndOfStream())
            {
                if (!regexParseInterface.Read())
                    Assert.Fail("error parsing input at position {0}", regexParseInterface.Position);
            }
            Assert.IsTrue(regexParseEngine.IsAccepted());

            var nodeVisitor = new NodeVisitor();
            var root = regexParseEngine.GetRoot();
            root.Accept(nodeVisitor);
            Assert.AreEqual(34, nodeVisitor.VisitLog.Count);
        }
Esempio n. 36
0
        public void Test_Lexeme_That_Matches_Longest_Acceptable_Token_When_Given_Ambiguity()
        {
            var lexemeList = new List<ParseEngineLexeme>();

            const string There = "there";
            var thereGrammar = new GrammarBuilder(There)
                .Production(There, r => r
                    .Rule('t', 'h', 'e', 'r', 'e'))
                .ToGrammar();
            var thereParseEngine = new ParseEngine(thereGrammar);
            var thereLexeme = new ParseEngineLexeme(thereParseEngine, new TokenType(There));
            lexemeList.Add(thereLexeme);

            const string Therefore = "therefore";
            var thereforeGrammar = new GrammarBuilder(Therefore)
                .Production(Therefore, r => r
                    .Rule('t', 'h', 'e', 'r', 'e', 'f', 'o', 'r', 'e'))
                .ToGrammar();
            var parseEngine = new ParseEngine(thereforeGrammar);
            var thereforeLexeme = new ParseEngineLexeme(parseEngine, new TokenType(Therefore));
            lexemeList.Add(thereforeLexeme);

            var input = "therefore";
            var i = 0;
            for (; i < input.Length; i++)
            {
                var passedLexemes = lexemeList
                    .Where(l => l.Scan(input[i]))
                    .ToList();

                // all existing lexemes have failed
                // fall back onto the lexemes that existed before
                // we read this character
                if (passedLexemes.Count() == 0)
                    break;

                lexemeList = passedLexemes;
            }

            Assert.AreEqual(i, input.Length);
            Assert.AreEqual(1, lexemeList.Count);
            var remainingLexeme = lexemeList[0];
            Assert.IsNotNull(remainingLexeme);
            Assert.IsTrue(remainingLexeme.IsAccepted());
        }
Esempio n. 37
0
        public void Test_Lexeme_That_Consumes_Whitespace()
        {
            var grammar = new GrammarBuilder("S")
                .Production("S", r=>r
                    .Rule("W")
                    .Rule("W", "S"))
                .Production("W", r => r
                    .Rule(new WhitespaceTerminal()))
                .ToGrammar();

            var lexerRule = new GrammarLexerRule(
                "whitespace",
                grammar);

            var parseEngine = new ParseEngine(lexerRule.Grammar);
            var lexeme = new ParseEngineLexeme(parseEngine, new TokenType("whitespace"));
            var input = "\t\r\n\v\f ";
            for (int i = 0; i < input.Length; i++)
                Assert.IsTrue(lexeme.Scan(input[i]));
            Assert.IsTrue(lexeme.IsAccepted());
        }
Esempio n. 38
0
        public void Test_Bnf_That_Parse_Produces_Bnf_Chart()
        {
            var grammar = new BnfGrammar();
            var parseEngine = new ParseEngine(grammar);
            var parseInterface = new ParseInterface(parseEngine, _bnfText);

            while (!parseInterface.EndOfStream())
            {
                if (!parseInterface.Read())
                {
                    var position = parseInterface.Position;
                    var startIndex = 0;
                    for (int i = position; i >= 0; i--)
                    {
                        if (_bnfText[i] == '\n' && i > 0)
                            if (_bnfText[i - 1] == '\r')
                            {
                                startIndex = i;
                                break;
                            }
                    }
                    var endIndex = _bnfText.IndexOf("\r\n", position);
                    endIndex = endIndex < 0 ? _bnfText.Length : endIndex;
                    var length = endIndex - startIndex;
                    var stringBuilder = new StringBuilder();
                    stringBuilder
                        .AppendFormat("Error parsing input string at position {0}.", parseInterface.Position)
                        .AppendLine()
                        .AppendFormat("start: {0}", startIndex)
                        .AppendLine()
                        .AppendLine(_bnfText.Substring(startIndex, length));

                    Assert.Fail(stringBuilder.ToString());
                }
            }
            Assert.IsTrue(
                parseInterface.ParseEngine.IsAccepted(),
                "error at position {0}", parseInterface.Position);
        }
 public YAMPOperatorMissingError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
 internal YAMPFunctionArgumentsSymbols(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
Esempio n. 41
0
 /// <summary>
 /// Creates a new YAMP Parse Exception.
 /// </summary>
 /// <param name="engine">The engine where this happend.</param>
 public YAMPParseException(ParseEngine engine)
     : base("The query can not run, since the parser encountered {0} error(s).", engine.ErrorCount)
 {
     Errors = engine.Errors;
 }
Esempio n. 42
0
 internal YAMPForArgumentsMissing(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
 internal YAMPStringNotTerminatedError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
 internal YAMPExpressionMissingError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
Esempio n. 45
0
 internal YAMPKeywordNotPossible(ParseEngine pe, String keyword)
     : this(pe.CurrentLine, pe.CurrentColumn, keyword)
 {
 }
 internal YAMPBracketNotClosedError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
 internal YAMPExpressionMissingError(ParseEngine pe, Operator op, Int32 found)
     : base(pe.CurrentLine, pe.CurrentColumn, "The {0} operator requires {1} expression(s), but only {2} expression(s) have been found.", op.Op, op.Expressions, found)
 {
 }
Esempio n. 48
0
 internal YAMPIfRequiredError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
Esempio n. 49
0
 internal YAMPVariableNameMissing(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
Esempio n. 50
0
 internal YAMPBracketEmptyError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
 internal YAMPTerminatorMissingError(ParseEngine pe, Char terminator)
     : this(pe.CurrentLine, pe.CurrentColumn, terminator)
 {
 }
Esempio n. 52
0
 internal YAMPSingleElseError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
Esempio n. 53
0
 internal YAMPFunctionNameMissing(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }
 internal YAMPEscapeSequenceNotFoundError(ParseEngine pe, Char sequence)
     : this(pe.CurrentLine, pe.CurrentColumn, sequence)
 {
 }
Esempio n. 55
0
 /// <summary>
 /// Creates a new instance.
 /// </summary>
 /// <param name="child">The child to add.</param>
 /// <param name="engine">The engine that has been used.</param>
 public TreeExpression(ContainerExpression child, ParseEngine engine)
     : this(child, engine.Query, engine.CurrentLine, engine.CurrentColumn)
 {
 }
 internal YAMPDoWhileNotEmptyError(ParseEngine pe)
     : this(pe.CurrentLine, pe.CurrentColumn)
 {
 }