示例#1
0
        public void Simple()
        {
            var grammarString = @"
	<ws> ::= <WhiteSpace> <ws>
			|

	<simple-value> ::= <simple-value> <LetterOrDigit>
				| <simple-value>

	<bracket-value> ::= <bracket-value> <simple-value>
						| <bracket-value>

	<optional-bracket> ::= '(' <bracket-value> ')'
							| <simple-value>

	<first> ::= <optional-bracket>

	<second> ::= <optional-bracket>

	<grammar> ::= <ws> <first> <second> <ws>
	"    ;

            var input = "  hello ( parsing world )  ";

            // our grammar
            var grammar = new BnfGrammar().Build(grammarString, "grammar");

            var match = grammar.Match(input);

            Assert.IsTrue(match.Success);
            Assert.AreEqual("hello", match["first"]["simple-value", true].Text);
            Assert.AreEqual("parsing world", match["second"]["bracket-value", true].Text);
        }
 BnfGrammar Convert(EbnfGrammar EG)
 {
     Bnf       = new BnfGrammar();
     Footprint = new OperationFootprintGroup <EbnfGrammar, BnfGrammar> (EG, Bnf);
     foreach (var er in EG.Rules)
     {
         BnfRule br = Convert(er);
     }
     Footprint.Parts = ops.ToArray();
     return(Bnf);
 }
示例#3
0
        public bool Parse()
        {
            var grammar     = new BnfGrammar();
            var parseEngine = new ParseEngine(grammar);
            var parseRunner = new ParseRunner(parseEngine, sampleBnf);

            while (!parseRunner.EndOfStream() && parseRunner.Read())
            {
            }
            return(parseRunner.ParseEngine.IsAccepted());
        }
示例#4
0
        public void BnfToCode()
        {
            // roundtrip to generated code then back again
            var bnfParser = new BnfGrammar();

            // generate code from bnf
            var code = bnfParser.ToCode(postalAddressBnf, "postal-address", "PostalGrammar");

            // execute the code and test
            var addressParser = Helper.Create <Grammar>(code, "PostalGrammar");

            TestAddress(addressParser);
        }
示例#5
0
        public void BnfShouldProduceParseChartForTextGrammar()
        {
            var grammar     = new BnfGrammar();
            var parseEngine = new ParseEngine(grammar);
            var parseRunner = new ParseRunner(parseEngine, _bnfText);

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    var position   = parseRunner.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(
                        System.Environment.NewLine,
                        position,
                        System.StringComparison.CurrentCulture);
                    endIndex = endIndex < 0 ? _bnfText.Length : endIndex;
                    var length        = endIndex - startIndex;
                    var stringBuilder = new StringBuilder();
                    stringBuilder
                    .Append($"Error parsing input string at position {parseRunner.Position}.")
                    .AppendLine()
                    .Append($"start: {startIndex}")
                    .AppendLine()
                    .AppendLine(_bnfText.Substring(startIndex, length));

                    Assert.Fail(stringBuilder.ToString());
                }
            }
            Assert.IsTrue(
                parseRunner.ParseEngine.IsAccepted(),
                $"error at position {parseRunner.Position}");
        }
示例#6
0
        public void BnfShouldParseLargeGrammarInFile()
        {
            var bnf = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "Bnf", "AnsiC.bnf"));

            Assert.IsFalse(string.IsNullOrEmpty(bnf));

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

            while (!parseRunner.EndOfStream())
            {
                if (!parseRunner.Read())
                {
                    Assert.Fail($"Error Parsing At Position {parseRunner.Position}");
                }
            }
            Assert.IsTrue(parseEngine.IsAccepted());
        }
示例#7
0
        private static string GetCode(CommandLineOptions opts)
        {
            switch (Path.GetExtension(opts.GrammarFile))
            {
            case ".bnf":
                var gr = new BnfGrammar();
                return(gr.ToCode(File.ReadAllText(opts.GrammarFile), opts.StartParser, opts.GrammarName));

            case ".ebnf":
                var egr = new EbnfGrammar(EbnfStyle.W3c | EbnfStyle.SquareBracketAsOptional | EbnfStyle.WhitespaceSeparator);
                return(egr.ToCode(File.ReadAllText(opts.GrammarFile), opts.StartParser, opts.GrammarName));

            case ".gold":
                var ggr = new GoldGrammar();
                return(ggr.ToCode(File.ReadAllText(opts.GrammarFile), opts.GrammarName));
            }

            throw new Exception("Unknown Grammar. Try .ebnf .bnf .gold");
        }
        public ElkhoundGlrParser(
            object context,
            BnfGrammar grammar,
            TransitionDelegate transition,
            GrammarActionDelegate grammarAction,
            int[]                 stateToPriorToken,
            int[]                   conflictActionsTable,
            Func <object, int, IReciever <Msg>, IReciever <Msg> > makeSwitch)
        {
            this.context              = context;
            this.grammar              = grammar;
            this.grammarAction        = grammarAction;
            this.transition           = transition;
            this.stateToPriorToken    = stateToPriorToken;
            this.conflictActionsTable = conflictActionsTable;
            this.gss = new Gss();

            gss.AddTopmost(0);
        }
示例#9
0
        public void BnfParsingSpeed()
        {
            var bnfParser = new BnfGrammar();

            Helper.TestSpeed(bnfParser, postalAddressBnf, speedIterations);
        }
示例#10
0
        public static Grammar GetAddressParser()
        {
            var bnfParser = new BnfGrammar();

            return(bnfParser.Build(postalAddressBnf, "postal-address"));
        }